星期日, 一月 21, 2007

docbook xml (1)

XML 的应用已经非常广泛,现在必须放到我们的学习计划中来。但目前好像没有什么很好的材料,而 XML 本身也是比较复杂的,所以如果单纯的去啃那些理论性的东西,一定会非常的枯燥和令人厌烦,特别是那种文档性质的东西就更是如此(系统化介绍的书籍会好些)。那么正确的方法应该是从一种实际的应用开始,这相对来说应该会简单一些。DocBook 就是这样的一种应用。

不过 DocBook 本身也够理论化的,一大堆概念摆在面前也不是那么好消化的。在看了《DocBook: The Definitive Guide》后,对 XML 和 DocBook 基本上有了点认识(当然对 XML 以前也不是没有一点概念:_),但仍然是有点头大的。所以我想,干脆不管多的,先实际操作起来,边做边学吧──从实践中去领会应该是最好的办法。

首先是安装 DocBook,因为是使用 XML 的 DocBook 而不是 SGML,所以安装 docbook-xml-4.4。所谓安装 docbook-xml,其实基本上就是把一些 DocBook XML 的 DTD 文件拷贝到系统中。DTD(Document Type Definition)实际上就是一些文本文件,用来定义 XML 的有效性的,即 XML 可以包含那些元素,这些元素应该是怎样的顺序和嵌套关系、它们可以有那些子元素等。比如在 DocBook 这个具体的例子中,一个 Book 可以包含 Abstract, Chapter, Section, Paragraph, Bibliography... 这些元素,而象 Foo 这样的东西出现在你书籍的结构中就毫无意义;同时,你不可能把 Chapter 放在 Section 里;也不能把 Bibliography 放在书籍开头而把 Abstract 放在结束的地方,所有这些都由 DTD 定义,当处理程序进行处理时会自动进行检查。通常 DocBook 的 DTD 是 docbook.dtd,XML 为 docbookx.dtd。

我直接使用了 BLFS 上的安装方法:
pkgname = "docbook-xml";
version = "4.4";
user = "docbook-xml";
groups = "";
group = "docbook-xml";
archive = "docbook-xml-4.4.zip";
command = "mkdir docbook-xml";
command = "cd docbook-xml";
command = "unzip ../docbook-xml-4.4.zip";
command = "install -v -d -m755 /usr/share/xml/docbook/xml-dtd-4.4";
command = "install -v -d -m755 /etc/xml";
command = "cp -v -af docbook.cat *.dtd ent/ *.mod /usr/share/xml/docbook/xml-dtd-4.4";
command = "if [ ! -e /etc/xml/docbook ]; then xmlcatalog --noout --create /etc/xml/docbook; fi";
command = "xmlcatalog --noout --add "public" "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" /etc/xml/docbook";
command = "xmlcatalog --noout --add "public" "-//OASIS//DTD DocBook XML CALS Table Model V4.4//EN" "file:///usr/share/xml/docbook/xml-dtd-4.4/calstblx.dtd" /etc/xml/docbook";
command = "xmlcatalog --noout --add "public" "-//OASIS//DTD XML Exchange Table Model 19990315//EN" "file:///usr/share/xml/docbook/xml-dtd-4.4/soextblx.dtd" /etc/xml/docbook";
command = "xmlcatalog --noout --add "public" "-//OASIS//ELEMENTS DocBook XML Information Pool V4.4//EN" "file:///usr/share/xml/docbook/xml-dtd-4.4/dbpoolx.mod" /etc/xml/docbook";
command = "xmlcatalog --noout --add "public" "-//OASIS//ELEMENTS DocBook XML Document Hierarchy V4.4//EN" "file:///usr/share/xml/docbook/xml-dtd-4.4/dbhierx.mod" /etc/xml/docbook";
command = "xmlcatalog --noout --add "public" "-//OASIS//ELEMENTS DocBook XML HTML Tables V4.4//EN" "file:///usr/share/xml/docbook/xml-dtd-4.4/htmltblx.mod" /etc/xml/docbook";
command = "xmlcatalog --noout --add "public" "-//OASIS//ENTITIES DocBook XML Notations V4.4//EN" "file:///usr/share/xml/docbook/xml-dtd-4.4/dbnotnx.mod" /etc/xml/docbook";
command = "xmlcatalog --noout --add "public" "-//OASIS//ENTITIES DocBook XML Character Entities V4.4//EN" "file:///usr/share/xml/docbook/xml-dtd-4.4/dbcentx.mod" /etc/xml/docbook";
command = "xmlcatalog --noout --add "public" "-//OASIS//ENTITIES DocBook XML Additional General Entities V4.4//EN" "file:///usr/share/xml/docbook/xml-dtd-4.4/dbgenent.mod" /etc/xml/docbook";
command = "xmlcatalog --noout --add "rewriteSystem" "http://www.oasis-open.org/docbook/xml/4.4" "file:///usr/share/xml/docbook/xml-dtd-4.4" /etc/xml/docbook";
command = "xmlcatalog --noout --add "rewriteURI" "http://www.oasis-open.org/docbook/xml/4.4" "file:///usr/share/xml/docbook/xml-dtd-4.4" /etc/xml/docbook";
command = "if [ ! -e /etc/xml/catalog ]; then xmlcatalog --noout --create /etc/xml/catalog; fi";
command = "xmlcatalog --noout --add "delegatePublic" "-//OASIS//ENTITIES DocBook XML" "file:///etc/xml/docbook" /etc/xml/catalog";
command = "xmlcatalog --noout --add "delegatePublic" "-//OASIS//DTD DocBook XML" "file:///etc/xml/docbook" /etc/xml/catalog";
command = "xmlcatalog --noout --add "delegateSystem" "http://www.oasis-open.org/docbook/" "file:///etc/xml/docbook" /etc/xml/catalog";
command = "xmlcatalog --noout --add "delegateURI" "http://www.oasis-open.org/docbook/" "file:///etc/xml/docbook" /etc/xml/catalog";
command = "cd ..";
command = "rm -rf docbook-xml";
time = "20070121 22:12:35 Sun";
这中间有许多 xmlcatalog(属于 libxml2 包),只是为了创建 /etc/xml/catalog 和 /etc/xml/docbook 这两个文件。这两个文件本身也是 XML 文件,只是比较特殊,是专门的 catalog 文件:!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"。所谓 catalog,实际上是一些映射文件,将 Public Identifier 映射为 System Identifier。

而 Identifier 是 DocBook XML 文档中对于外部文件的引用的说明,即引用了那些外部文档,通常都是 DTD,如 DocBook 本身的 DTD docbookx.dtd(注意区分一下 DocBook 文档和 DocBook 本身!)。Identifier 通常分为 PUBLIC 和 SYSTEM 两种,例如在一个 XML 文档中:
"<"!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"">"
这里是一个文档类型申明,即 DTD,PUBLIC 后面是一个 PUBLIC Identifier,然后是一个 SYSTEM Identifier,这里实际上是一个映射,将 PUBLIC Identifier 映射为 SYSTEM Identifier,所以 System Identifier 并不是指只有系统内部的 DTD!如上,只要是一个 URI 就行,当然必须是实际有效的。另外,XML 只能使用 System Identifier,所以必然会有这样一个映射,或者直接使用 SYSTEM:
"<"!DOCTYPE chapter SYSTEM "/usr/share/sgml/docbook/xml-dtd-4.2-1.0-25/docbookx.dtd"">"
所以编写一个 XML 文档,通常包括如下步骤:
1. 按照 DTD 定义编辑 XML 文档
2. 使用解析器进行解析,需要 Validate 检查
3. 依照样式表 XSL 将 XML 转换成其他格式,如 HTML/TEX 等
4. 针对不同格式使用不同工具检查效果

没有评论: