
SGML/XML 标记语言基础

SGML 的特征

文档结构

如何将文章分解成几块
(利用外部实体)
(利用外部实体)

Catalog 文件

The catalog file format was defined in 1994 by SGML Open (now OASIS). The formal specification is contained in OASIS Technical Resolution 9401:1997.

SGML 格式的 Catalog 文件

语法

对不同文档设置不同 SGMLDecl

如: 在一个 catalog 文件中既定义 DTD 的
声明文件,又定义XML的声明文件
声明文件,又定义XML的声明文件

SGMLDECL "dtd/docbook-4.5/docbook.dcl"
DTDDECL "-//OASIS//DTD DocBook XML V4.5CR1//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"
DTDDECL "-//OASIS//DTD DocBook XML V4.2//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"
DTDDECL "-//OASIS//DTD DocBook XML V3.1//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"
DTDDECL "-//OASIS//DTD DocBook XML V4.5CR1//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"
DTDDECL "-//OASIS//DTD DocBook XML V4.2//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"
DTDDECL "-//OASIS//DTD DocBook XML V3.1//EN" "dsssl/docbook-dsssl-1.79/dtds/decls/xml.dcl"

示例

-- Comments are delimited by pairs of double-hyphens,
as in SGML and XML comments. --
OVERRIDE YES
SGMLDECL "n:/share/sgml/docbook/3.1/docbook.dcl"
DOCTYPE BOOK n:/share/sgml/docbook/3.1/docbook.dtd
PUBLIC "-//OASIS//DTD DocBook V3.1//EN"
n:/share/sgml/docbook/3.1/docbook.dtd
SYSTEM "http://nwalsh.com/docbook/xml/1.3/db3xml.dtd"
n:/share/sgml/Norman_Walsh/db3xml/db3xml.dtd
as in SGML and XML comments. --
OVERRIDE YES
SGMLDECL "n:/share/sgml/docbook/3.1/docbook.dcl"
DOCTYPE BOOK n:/share/sgml/docbook/3.1/docbook.dtd
PUBLIC "-//OASIS//DTD DocBook V3.1//EN"
n:/share/sgml/docbook/3.1/docbook.dtd
SYSTEM "http://nwalsh.com/docbook/xml/1.3/db3xml.dtd"
n:/share/sgml/Norman_Walsh/db3xml/db3xml.dtd

XML格式的 Catalog 文件

语法

public/system 定位 DTD 位置

<?xml version="1.0"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<group prefer="public" xml:base="file:///usr/share/xml/" >
<public
publicId="-//OASIS//DTD DocBook XML V4.4//EN"
uri="docbook44/docbookx.dtd"/>
<system
systemId="http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
uri="docbook44/docbookx.dtd"/>
<system
systemId="docbook4.4.dtd"
uri="docbook44/docbookx.dtd"/>
</group>
</catalog>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<group prefer="public" xml:base="file:///usr/share/xml/" >
<public
publicId="-//OASIS//DTD DocBook XML V4.4//EN"
uri="docbook44/docbookx.dtd"/>
<system
systemId="http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
uri="docbook44/docbookx.dtd"/>
<system
systemId="docbook4.4.dtd"
uri="docbook44/docbookx.dtd"/>
</group>
</catalog>

uri 定位 XSL 样式表位置
(本地到本地)
(本地到本地)

<?xml version="1.0"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<uri
name="docbook.xsl"
uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/docbook.xsl"/>
</catalog>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<uri
name="docbook.xsl"
uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/docbook.xsl"/>
</catalog>

uri 将 web 地址对应本地文件
(URL 到本地)
(URL 到本地)

<?xml version="1.0"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system
systemId="http://www.oasis-open.org/docbook/xml/4.4/"
uri="file:///usr/share/xml/docbook44/" />
<uri
name="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"
uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/docbook.xsl" />
<uri
name="http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl"
uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/chunk.xsl" />
</catalog>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system
systemId="http://www.oasis-open.org/docbook/xml/4.4/"
uri="file:///usr/share/xml/docbook44/" />
<uri
name="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"
uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/docbook.xsl" />
<uri
name="http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl"
uri="file:///usr/share/xml/docbook-xsl-1.68.1/html/chunk.xsl" />
</catalog>

rewriteSystem 建立重写规则,
简化、合并 URI 项
简化、合并 URI 项

<?xml version="1.0"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<rewriteSystem
systemIdStartString="http://www.oasis-open.org/docbook/xml/4.4/"
rewritePrefix="file:///usr/share/xml/docbook44/" />
<rewriteURI
uriStartString="http://docbook.sourceforge.net/release/xsl/current/"
rewritePrefix="file:///usr/share/xml/docbook-xsl-1.68.1/" />
</catalog>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<rewriteSystem
systemIdStartString="http://www.oasis-open.org/docbook/xml/4.4/"
rewritePrefix="file:///usr/share/xml/docbook44/" />
<rewriteURI
uriStartString="http://docbook.sourceforge.net/release/xsl/current/"
rewritePrefix="file:///usr/share/xml/docbook-xsl-1.68.1/" />
</catalog>

SGML 时代的 DocBook

OpenSP

编译 OpenSP 之前

OpenSP 补丁

isSgmlChar

文件: include/Syntax.h
diff -r -u OpenSP-1.5.1/include/Syntax.h OpenSP-1.5.1-new/include/Syntax.h
--- OpenSP-1.5.1/include/Syntax.h 2005-12-18 10:38:50.890625000 +0800
+++ OpenSP-1.5.1-new/include/Syntax.h 2005-12-18 10:44:20.703125000 +0800
@@ -389,7 +389,7 @@
inline Boolean Syntax::isSgmlChar(Xchar c) const
{
- return c >= 0 && set_[sgmlChar].contains(Char(c));
+ return c >= 256 || c >= 0 && set_[sgmlChar].contains(Char(c));
}
inline const StringC &Syntax::reservedName(ReservedName i) const
diff -r -u OpenSP-1.5.1/include/Syntax.h OpenSP-1.5.1-new/include/Syntax.h
--- OpenSP-1.5.1/include/Syntax.h 2005-12-18 10:38:50.890625000 +0800
+++ OpenSP-1.5.1-new/include/Syntax.h 2005-12-18 10:44:20.703125000 +0800
@@ -389,7 +389,7 @@
inline Boolean Syntax::isSgmlChar(Xchar c) const
{
- return c >= 0 && set_[sgmlChar].contains(Char(c));
+ return c >= 256 || c >= 0 && set_[sgmlChar].contains(Char(c));
}
inline const StringC &Syntax::reservedName(ReservedName i) const

允许中文注释

文件: lib/parseCommon.cxx
diff -r -u OpenSP-1.5.1/lib/parseCommon.cxx OpenSP-1.5.1-new/lib/parseCommon.cxx
--- OpenSP-1.5.1/lib/parseCommon.cxx 1999-11-04 16:36:13.000000000 +0800
+++ OpenSP-1.5.1-new/lib/parseCommon.cxx 2005-12-18 10:46:41.781250000 +0800
@@ -541,14 +541,12 @@
Token token;
while ((token = getToken(mode)) != tokenCom)
switch (token) {
- case tokenUnrecognized:
- if (!reportNonSgmlCharacter())
- message(ParserMessages::sdCommentSignificant,
- StringMessageArg(currentToken()));
- break;
case tokenEe:
message(ParserMessages::commentEntityEnd, startLoc);
return 0;
+ case tokenUnrecognized:
+ if (reportNonSgmlCharacter())
+ break;
default:
if (markup)
markup->addCommentChar(currentChar());
diff -r -u OpenSP-1.5.1/lib/parseCommon.cxx OpenSP-1.5.1-new/lib/parseCommon.cxx
--- OpenSP-1.5.1/lib/parseCommon.cxx 1999-11-04 16:36:13.000000000 +0800
+++ OpenSP-1.5.1-new/lib/parseCommon.cxx 2005-12-18 10:46:41.781250000 +0800
@@ -541,14 +541,12 @@
Token token;
while ((token = getToken(mode)) != tokenCom)
switch (token) {
- case tokenUnrecognized:
- if (!reportNonSgmlCharacter())
- message(ParserMessages::sdCommentSignificant,
- StringMessageArg(currentToken()));
- break;
case tokenEe:
message(ParserMessages::commentEntityEnd, startLoc);
return 0;
+ case tokenUnrecognized:
+ if (reportNonSgmlCharacter())
+ break;
default:
if (markup)
markup->addCommentChar(currentChar());

catalog

SGMLDECL "/home/JiangXin/work/docbook/dtd/4.5/docbook.dcl"
CATALOG "/home/JiangXin/work/docbook/dtd/4.5/docbook.cat"
DOCTYPE book /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
CATALOG "/home/JiangXin/work/docbook/dtd/4.5/docbook.cat"
DOCTYPE book /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

应用

准备

创建一个 catalog 文件

catalog 文件

DOCTYPE book /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

示例

-- ...................................................................... --
-- "export SGML_CATALOG_FILES=/PATH/catalog" --
OVERRIDE YES
SGMLDECL "/home/JiangXin/work/docbook/dtd/4.5/docbook.dcl"
CATALOG "/home/JiangXin/work/docbook/dtd/4.5/docbook.cat"
CATALOG "/home/JiangXin/work/docbook/style/dsssl-1.79/catalog"
-- CATALOG "dtd/openjade/catalog" --
-- CATALOG "/home/JiangXin/work/docbook/dtd/entities/catalog.sgml" --
DOCTYPE book /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
-- "export SGML_CATALOG_FILES=/PATH/catalog" --
OVERRIDE YES
SGMLDECL "/home/JiangXin/work/docbook/dtd/4.5/docbook.dcl"
CATALOG "/home/JiangXin/work/docbook/dtd/4.5/docbook.cat"
CATALOG "/home/JiangXin/work/docbook/style/dsssl-1.79/catalog"
-- CATALOG "dtd/openjade/catalog" --
-- CATALOG "/home/JiangXin/work/docbook/dtd/entities/catalog.sgml" --
DOCTYPE book /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE article /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd
DOCTYPE chapter /home/JiangXin/work/docbook/dtd/4.5/docbook.dtd

docbook.dcl 补丁

- LCNMCHAR ".-_"
- UCNMCHAR ".-_"
+ LCNMCHAR ".-_:"
+ UCNMCHAR ".-_:"
- UCNMCHAR ".-_"
+ LCNMCHAR ".-_:"
+ UCNMCHAR ".-_:"

否则:
onsgmls:/home/JiangXin/work/docbook/dtd/4.5/htmltblx.mod:102:9:E: character ":"
invalid: only "CDATA", "ENTITIES", "ENTITY", "ID", "IDREF", "IDREFS", "NAME", "N
AMES", "NMTOKEN", "NMTOKENS", "NOTATION", "NUMBER", "NUMBERS", "NUTOKEN", "NUTOK
ENS" and parameter separators allowed
onsgmls:/home/JiangXin/work/docbook/dtd/4.5/htmltblx.mod:110:9:E: character ":"
invalid: only "CDATA", "ENTITIES", "ENTITY", "ID", "IDREF", "IDREFS", "NAME", "N
AMES", "NMTOKEN", "NMTOKENS", "NOTATION", "NUMBER", "NUMBERS", "NUTOKEN", "NUTOK
ENS" and parameter separators allowed
onsgmls:/home/JiangXin/work/docbook/dtd/4.5/htmltblx.mod:102:9:E: character ":"
invalid: only "CDATA", "ENTITIES", "ENTITY", "ID", "IDREF", "IDREFS", "NAME", "N
AMES", "NMTOKEN", "NMTOKENS", "NOTATION", "NUMBER", "NUMBERS", "NUTOKEN", "NUTOK
ENS" and parameter separators allowed
onsgmls:/home/JiangXin/work/docbook/dtd/4.5/htmltblx.mod:110:9:E: character ":"
invalid: only "CDATA", "ENTITIES", "ENTITY", "ID", "IDREF", "IDREFS", "NAME", "N
AMES", "NMTOKEN", "NMTOKENS", "NOTATION", "NUMBER", "NUMBERS", "NUTOKEN", "NUTOK
ENS" and parameter separators allowed

OpenJade

编译 OpenJade

测试(参见 dsssl-doc 的例子)

测试 openjade:

可能出现的错误

openjade:jtest.dsl:1:72:W: cannot generate system identifier for public text "-//James Clark//DTD DSSSL Style Sheet//EN"
openjade:jtest.dsl:1:72:E: reference to entity "STYLE-SHEET" for which no system identifier could be generated
openjade:jtest.dsl:1:0: entity was defined here
openjade:E: specification document does not have the DSSSL architecture as a base architecture
openjade:jtest.dsl:1:72:E: reference to entity "STYLE-SHEET" for which no system identifier could be generated
openjade:jtest.dsl:1:0: entity was defined here
openjade:E: specification document does not have the DSSSL architecture as a base architecture

如何指定 DSSSL 样式表

一个DSSSL样式表文件可能包含
多个样式,如何指定?
多个样式,如何指定?

两种方式定义的多样式DSSSL文件

仅通过参数进行实体控制,
只包含一个 style-specification
只包含一个 style-specification

<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY % html "IGNORE">
<![%html;[
<!ENTITY % print "IGNORE">
<!ENTITY docbook.dsl PUBLIC "-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN" CDATA dsssl>
]]>
<!ENTITY % print "INCLUDE">
<![%print;[
<!ENTITY docbook.dsl PUBLIC "-//Norman Walsh//DOCUMENT DocBook Print Stylesheet//EN" CDATA dsssl>
]]>
]>
<style-sheet>
<style-specification use="docbook">
<style-specification-body>
;; common customization can go here
<![%print;[
;; customize the print stylesheet here
]]>
<![%html;[
;; customize the html stylesheet here
]]>
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="docbook.dsl">
</style-sheet>
<!ENTITY % html "IGNORE">
<![%html;[
<!ENTITY % print "IGNORE">
<!ENTITY docbook.dsl PUBLIC "-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN" CDATA dsssl>
]]>
<!ENTITY % print "INCLUDE">
<![%print;[
<!ENTITY docbook.dsl PUBLIC "-//Norman Walsh//DOCUMENT DocBook Print Stylesheet//EN" CDATA dsssl>
]]>
]>
<style-sheet>
<style-specification use="docbook">
<style-specification-body>
;; common customization can go here
<![%print;[
;; customize the print stylesheet here
]]>
<![%html;[
;; customize the html stylesheet here
]]>
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="docbook.dsl">
</style-sheet>

不同的 style-specification 具有不同的 ID,
另外还有参数实体控制
另外还有参数实体控制

<!DOCTYPE style-sheet PUBLIC
"-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY % html "IGNORE">
<![%html;[
<!ENTITY % print "IGNORE">
<!ENTITY docbook.dsl PUBLIC
"-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN"
CDATA dsssl>
]]>
<!ENTITY % print "INCLUDE">
<![%print;[
<!ENTITY docbook.dsl PUBLIC
"-//Norman Walsh//DOCUMENT DocBook Print Stylesheet//EN"
CDATA dsssl>
]]>
]>
<style-sheet>
<style-specification id="print" use="docbook">
<style-specification-body>
;; customize the print stylesheet
...
</style-specification-body>
</style-specification>
<!--
;; customize the html stylesheet; parts borrowed from
;; Cygnus at http://sourceware.cygnus.com/ (cygnus-both.dsl)
-->
<style-specification id="html" use="docbook">
<style-specification-body>
... ...
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="docbook.dsl">
</style-sheet>
"-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY % html "IGNORE">
<![%html;[
<!ENTITY % print "IGNORE">
<!ENTITY docbook.dsl PUBLIC
"-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN"
CDATA dsssl>
]]>
<!ENTITY % print "INCLUDE">
<![%print;[
<!ENTITY docbook.dsl PUBLIC
"-//Norman Walsh//DOCUMENT DocBook Print Stylesheet//EN"
CDATA dsssl>
]]>
]>
<style-sheet>
<style-specification id="print" use="docbook">
<style-specification-body>
;; customize the print stylesheet
...
</style-specification-body>
</style-specification>
<!--
;; customize the html stylesheet; parts borrowed from
;; Cygnus at http://sourceware.cygnus.com/ (cygnus-both.dsl)
-->
<style-specification id="html" use="docbook">
<style-specification-body>
... ...
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="docbook.dsl">
</style-sheet>
