13. SGML 和 SGML-Tools

在之前的章节中,我抛弃了许多 DocBook 的历史。XML 有一个哥哥,即 SGML,或标准通用标记语言 (Standard Generalized Markup Language)。

直到 2002 年中期,如果讨论 DocBook 而不长篇大论地介绍 SGML、SGML 和 XML 之间的区别,以及 SGML DocBook 工具链的详细描述,那将是不完整的。现在生活可以更简单了;XML DocBook 工具链在开源中可用,其工作方式与 SGML 工具链曾经一样好,并且更容易使用。如果您认为您永远不必处理旧的 SGML-Docbook 文档,您可以跳过本节的剩余部分。

13.1. DocBook SGML

DocBook 最初是一个 SGML 应用程序,并且曾经有一个基于 SGML 的 DocBook 工具链,但现在已经衰落了。DocBook SGML DTD 和 DocBook XML DTD 之间存在细微的差异,但对于入门讨论,我们可以忽略它们。唯一一个通常用户可见的区别是,在 SGML 中,无内容标签不需要在结束 > 之前添加尾部斜杠。(要求尾部斜杠 / 意味着 XML 解析器可以简单得多,因为它们不必知道 DTD 即可知道哪些开始标签需要闭合。)

HTML 4.01 之前的版本(XHTML 之前)是 SGML 应用程序。TEI 最初也是一个 SGML 应用程序。管理所有三个 DTD 的小组都跳转到 XML,原因与 DocBook 的开发者相同 —— 它非常简单。SGML 非常复杂;事实证明,复杂得难以管理。该规范是一份 150 页的密集文档,并且据不可靠报道,没有任何软件完全实现了它。

我之前给出的工具链图是简化的;它只显示了 XML 工具链。这是历史上正确的版本

DSSSL 工具链是处理 DocBook SGML 的工具链。在它之下,文档从 DocBook 格式通过两个密切相关的样式表引擎之一,称为 Jade 和 OpenJade。这些将其转换为 TeX 宏标记,然后由一个名为 JadeTeX 的软件包处理,转换为 DVI,然后 DVI 被转换为 Postscript。

13.2. SGML 工具

docbook-tools 项目提供了开源工具,用于将 SGML DocBook 转换为 HTML、Postscript 和其他格式。此软件包随 Red Hat 和其他 Linux 发行版一起发布。它由 Mark Galassi 维护。

Jade 是一个用于将 DSSSL 样式表应用于 SGML 文档的引擎。它由 James Clark 维护。

OpenJade 是一个社区项目,之所以启动是因为创始人认为 James Clark 对 Jade 的维护断断续续。docbook-tools 程序使用 OpenJade。

PassiveTeX 是 LaTeX 宏包,xmlto 使用它从 XML-DocBook 生成 DVI。JadeTex 是 LaTeX 宏包,OpenJade 使用它从 SGML-DocBook 生成 DVI。

13.3. 为什么 SGML DocBook 已经过时

就新开发而言,DSSSL 工具链实际上已经过时了。XSLT 工具链在 2002 年中期达到了生产状态;Red Hat 7.3 中发布了一个可用的版本。DocBook 开发者几乎将所有的精力都投入到了 XSLT 工具链中。

转向 XML 的原因有三方面。首先,SGML 被证明太复杂而难以使用;其次,DSSSL 被证明太复杂而难以共存;然后,DSSSL 工具链的重要部分被证明是薄弱且无可救药的混乱。

相对于 SGML,XML 具有精简的功能集,该功能集足以满足几乎所有目的,但更易于理解和构建解析器。SGML 处理工具(例如验证解析器)必须携带对 DocBook 和其他文本标记系统从未实际使用过的许多功能的支持。删除这些功能使 XML 更简单,XML 处理工具更快。

用于描述 SGML DTD 的语言足够尖锐且令人望而生畏,以至于编写 SGML DTD 有点像一门黑魔法。另一方面,XML DTD 可以用 XML 本身的方言来描述;不需要单独的 DTD 语言。XML DTD 的 XML 描述称为模式;随着模式标准的确定,DTD 术语本身可能会逐渐退出使用。

但 DSSSL 工具链主要过时的原因是 DSSSL 本身,即该工具链中的 SGML 样式表描述语言,对于大多数人来说被证明太晦涩难懂,并且使得样式表太难编写和修改。(它是 Scheme 的一种方言。您谦逊的编辑,一位资深的 LISP 爱好者,悲哀而困惑地摇头,这竟然会把人们吓跑。)

XML 爱好者喜欢用“XML:味道好极了,分量更少。”来总结所有这些变化。

13.4. SGML-Tools

SGML-Tools 是 Linux 文档项目使用的一种 DTD 的名称,它是在几年前开发的,当时今天的 DocBook 工具链尚不存在。SGML-Tools 标记更简单,但也远不如 DocBook 灵活。最初的 SGML-Tools 格式化程序/DTD/样式表工具链已经过时一段时间了,但一个名为 SGML-tools Lite 的后继者仍在维护。

LDP 一直在逐步淘汰 SGML-Tools,转而支持 DocBook,但您仍然有可能接手旧的 HOWTO。这些可以通过识别标头“<!doctype linuxdoc system>”来识别。如果这种情况发生在您身上,请将该东西转换为 XML DocBook,并将旧版本快速埋葬。