XML - 管理数据交换/DocBook
XML - 管理数据交换
|
相关主题
|
参与
|
上一章 | 下一章 |
← VoiceXML | SMIL → |
完成本章后,您将能够
- 了解 DocBook 的基础知识
- 使用 DocBook XML DTD 创建 DocBook 文档
- 将文本文档转换为 DocBook 文档
- 使用 XSL 样式表将 DocBook XML 文档转换为多种格式,例如 HTML、PDF 或演示文稿幻灯片。
DocBook 是一种通用 XML 和 SGML 词汇表,特别适合书籍、文章和论文。它有一个庞大、强大且易于理解的文档类型定义 (DTD),其主要结构对应于构成书籍的一般概念。DocBook 是一个重要的主题,我们无法在几页纸内完全涵盖。因此,在本节中,我们将讨论使用 DocBook DTD 中的主要元素创建简单的 DocBook 文档,以及发布文档的详细信息,以便让您对 DocBook 有所了解。如果您想进一步学习该主题,我们建议您参考本章末尾提供的参考资料。
- DocBook 使您能够以与演示无关的格式创作和存储文档内容,该格式捕获内容的逻辑结构。
- 它有一个易于理解且广泛使用的 DTD。DocBook 标记的应用方式使其具有某种“常识”语义内容,至少对英语使用者而言是这样。
- 目前还没有 DocBook W3C XML Schema 的官方版本。DocBook 技术委员会计划在 DocBook V5.0 时间范围内提供官方 Schema。本章提供的示例将使用当前官方 DTD。
DTD 是 XML 文档类型定义,它包含或指向标记声明,这些声明为一类文档提供语法。Schema 是一个共享词汇表集,允许机器执行人们制定的规则。它提供了一种定义 XML 文档结构、内容和语义的方法。总之,Schema 是比 DTD 更丰富、更强大的描述信息的方式。
表 1:这是一个简单的 XML 文档
<author>
<firstname>Rusen</firstname>
<lastname>Gul</lastname>
</author>
表 2:这是该文档的 DTD
<!ELEMENT author(firstname, lastname)>
<!ELEMENT firstname(#PCDATA)>
<!ELEMENT lastname(#PCDATA)>
表 3:这是 SCHEMA
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
XSL(可扩展样式语言)样式表可以将 DocBook XML 转换为以下格式
- HTML
- HTML 帮助(用于 Windows 帮助)
- Java 帮助
- XHTML
- XSL 格式化对象 (FO)
DSSSL(文档样式语义和规范语言)样式表可以将 DocBook SGML 转换为以下格式
- HTML
- MIF
- RTF
- TeX
DocBook 由 HaL Computer Systems 和 O'Reilly & Associates 创立于 1991 年左右。它最初是为保存 UNIX 文档的 troff 转换结果而开发的,以便能够交换这些文件。现在它由 OASIS 维护。DocBook 的官方网站是 http://www.oasis-open.org/docbook/
- 印刷/商业出版的书籍。许多作者使用 DocBook 来编写各种类型书籍,包括世界各地的各种印刷和在线格式。一些例子包括
- 文章、论文和学位论文
- 维护网站
- 制作演示文稿幻灯片、印刷手册和白皮书
- 商业软件和硬件的文档
DocBook 正式以 DTD 的形式提供给 XML 和 SGML。您可以在 OASIS 的 DocBook 官方网站上下载最新的 DocBook XML DTD 和 DocBook SGML DTD。本章提供的示例将使用 DocBook XML DTD。一些实验性的 DocBook 模式可以在 sourceforge.net 上获得。DocBook 受许多商业和开源工具的支持。易于定制和扩展的“标准”DocBookStylesheets 可从 DocBookOpenRepository 获得,以及其他免费的开源工具。有关更完整的商业和开源工具列表,请参阅 DocBook Wiki 上的 DocBookTools。
- XSLTProc: 最知名和最快的处理器之一。可在 http://xmlsoft.org/XSLT/ 获得。
- Apache FOP: XSL-FO 实现。可在 http://xmlgraphics.apache.org/fop/ 获得。
- Xt: 最初的 XSLT 处理器之一。现在使用频率较低。可在 www.jclark.com 获得。
- DocBook2x: 将 DocBook 转换为 man 和 Texinfo 页面。可在 Sourceforge 获得。
- Refdb: 从 DocBook 创建参考数据库和参考文献。可在 Sourceforge 获得。
- Arbortext Epic: 编辑和处理工具的综合套件。可在 Arbortext 网站 获得。
- RenderX XEP: FO 到 PDF 渲染引擎。可在 RenderX 网站 获得。
- Antenna House XSL Formatter: FO 到 PDF 渲染引擎。可在 Antenna House 网站 获得。
SGML 和 XML DTD 的语法非常相似,但并不完全相同。DocBook SGML DTD 和 XML DTD 之间的最大区别在于 SGML DTD 在某些内容模型中包含 SGML 排除。
示例:SGML DTD 将 <footnote> 排除为 <footnote> 的后代,因为在脚注中包含脚注在实践上没有多大意义。XML DTD 不能包含排除项,因此,如果您使用 DocBook XML DTD 创作,则可能会生成包含一些有效但不合逻辑的标记的文档,例如脚注中的脚注。
为了开始,您需要
- 一个 XML 编辑器。如果您还没有下载,请下载 NetBeans IDE。
- DocBook XML DTD。虽然使用 DTD 是可选的,但当您希望验证文档以检查它是否符合它声称符合的 DTD 时,DTD 会很有用。因此,DocBook DTD 可用于验证据称的 DocBook 文档。DocBook XML 4.2 是 DocBook DTD 的当前版本。在 DocBook 官方网站 上下载。
- DocBook XSL 样式表主要由 Norman Walsh 维护。有两套样式表:XSL 和 DSSSL。在 Sourceforge.net 上下载最新的 XSL 1.65.1 版本。
- 一个 XSLT 处理器(在后面的部分中介绍)
表 4:一个简单的 DocBook 书籍,“book.xml”
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<book>
<bookinfo>
<title>XML – Managing Data Exchange</title>
<author>
<firstname>Rusen</firstname>
<surname>Gul</surname>
</author>
</bookinfo>
<chapter>
<title>Introduction</title>
<sect1>
<title>First Section</title>
<para>This is a paragraph.</para>
</sect1>
<sect1>...</sect1>
</chapter>
<chapter>...</chapter>
<chapter>...</chapter>
<chapter>...</chapter>
<appendix>...</appendix>
<appendix>...</appendix>
</book>
表 5:一个简单的 DocBook 文章,“article.xml”
<?xml version="1.0"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article>
<articleinfo>
<title>A Simple Approach To DocBook</title>
<author>
<firstname>Rusen</firstname>
<surname>Gul</surname>
</author>
</articleinfo>
<para>This is the introductory paragraph of my article.</para>
<sect1>
<title>First Section</title>
<para>This is a paragraph in the first section.</para>
<sect2>
<title>This is the title for section2.</title>
<para>This is a paragraph in section2.</para>
</sect2>
<sect2>...</sect2>
<sect2>...</sect2>
</sect1>
<sect1>This is a high level section</sect1>
<sect1>...</sect1>
<sect1>...</sect1>
</article>
让我们检查一下典型 DocBook 文档的详细信息。DocBook XML 文件的标准标头是 DocType 声明
标准标头
<!DOCTYPE name FORMALID "Owner//Keyword Description//Language">
这告诉 XML 操作工具正在使用的 DTD。名称是文档中根元素的名称。FORMALID 被替换为 PUBLIC 或 SYSTEM 标识符或两者。PUBLIC 标识文档符合的 DTD。SYSTEM 通过 URI(统一资源指示符)明确声明文档中使用的 DTD 的位置。PUBLIC 标识符在 XML 文档中是可选的,虽然 SYSTEM 标识符在 DOCTYPE 声明中是强制性的。
标头示例
<?xml version="1.0"?> <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
所有者:Oasis
关键字描述:DTD DocBook XML V4.2
语言:EN - 英语
注意!如果您不在线,您需要将 URL 系统标识符更改为 DTD 安装的位置
<?xml version="1.0"?> <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "/usr/share/sgml/docbook/xml-dtd-4.2/docbookx.dtd">
在开始之前,这里有一个有用的提示!为了方便和性能,您可以考虑将文档分解为物理块,并分别处理每个块。如果您有一本书包含三个章节和两个附录,您可能创建一个名为 book.xml 的文件,如下所示
表 6:物理分隔的书籍,“dividedbook.xml”
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.2//EN"
[<!ENTITY chap1 SYSTEM "chap1.xml">
<!ENTITY chap2 SYSTEM "chap2.xml">
<!ENTITY chap3 SYSTEM "chap3.xml">
<!ENTITY appa SYSTEM "appa.xml">
<!ENTITY appb SYSTEM "appb.xml">]
<book>
<title>A Physically Divided Book</title>
&chap1;
&chap2;
&chap3;
&appa;
&appb;
</book>
然后,您可以方便地在单独的文件中编写章节和附录。这就是 DocBook 非常适合大型内容的原因。请注意,这些单独的文件没有也不应该有文档类型声明。
例如,第 1 章可能以如下方式开始
<chapter id="ch1"> <title>My First Chapter</title> <para>My first paragraph.</para>… ……………………………………………………………
这是一个 DocBook 元素的快速参考指南:http://www.docbook.org/tdg/en/html/ref-elements.html
有数百个 DocBook 元素。这就是使 docBook 非常强大的原因。我们将尝试在这里介绍主要的元素,让您自己查看其余部分。首先,进行分类;DocBook 元素可以大致分为以下几类
集合 | 书籍的集合 |
---|---|
书籍 | 书籍 |
分区 | 将书籍分成部分 |
组件 | 将书籍或分区分成章节 |
部分 | 细分组件 |
元信息元素 | 包含有关其他元素的信息 |
块元素 | 出现在段落级别 |
内联元素 | 用于标记运行文本 |
集合 是 DocBook 结构层次结构的顶层。没有任何东西包含 集合。
一些子元素:Book、SetIndex、SetInfo、Subtitle、Title、TitleAbbrev、ToC(目录)。
参考页面:http://www.oreilly.com/catalog/docbook/chapter/book/set.html
表 7:<set> 元素,“lordoftherings.xml”
<!DOCTYPE set PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<set>
<title>Lord of the Rings</title>
<setinfo>
<author>J.R. Tolkien</author>
</setinfo>
<book><title>The Fellowship of the Ring</title> ... </book>
<book><title>The Two Towers</title> ... </book>
<book><title>Return of the King</title> ... </book>
<set>
书籍 可能是文档中最常见的顶级元素。DocBook 对书籍的定义非常宽泛和一般。它没有强加严格的元素排序,让您自由发挥。
一些子元素:Appendix、Article、Bibliography、BookInfo、Chapter、Colophon、Dedication、Glossary、Index、LoT、Part、Preface、Reference、SetIndex、Subtitle、Title、TitleAbbrev、ToC。
参考页面:http://www.oreilly.com/catalog/docbook/chapter/book/book.html
<small>Table 8: <book> element, "xmlbook.xml"</small>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<book>
<title>XML – Managing Data Exchange</title>
<titleabbrev>XML</titleabbrev>
<bookinfo>
<legalnotice><para>No notice is required.</para></legalnotice>
<author><firstname>Rusen</firstname><surname>Gul</surname></author>
</bookinfo>
<dedication>
<para>This book is dedicated to MIST 7700 class of 2004 at UGA.</para>
</dedication>
<preface>
<title>Forword</title>
<para>The book aims to fulfill the need for an introductory XML
textbook. It contains the basics of XML as well as several tools
using XML.</para>
</preface>
<chapter>
<title>Introduction</title>
<para>At least one chapter, reference, part, or article is required.</para>
</chapter>
<appendix>
<title>Optional Appendix</title>
<para>Appendixes are optional but handy.</para>
</appendix>
</book>
分部 是在 Book 下的第一个层次结构级别。
子元素:Part(包含组件)、Reference(包含 RefEntrys)
这些包括前言、章节、附录、词汇表、参考书目和文章。组件通常包含块级元素 - 或节,一些可以包含导航组件和 RefEntrys。
表 9:<Bibliography> 元素,“references.xml”
<!DOCTYPE bibliography PUBLIC "-//OASIS//DTD DocBook 4.2//EN">
<bibliography>
<title>References</title>
<bibliomixed>
<bibliomset relation=article>
<surname>Watson</surname>
<firstname>Richard</firstname>.
<title role=article>Managing Global Communities </title>
</bibliomset>
<bibliomset relation=journal>
<title>The World Wide Web Journal</title>
<volumenum>2</volumenum>
<issuenum>1</issuenum>.
<publishername>O'Reilly & Associates, Inc.</publishername> and
<corpname>The World Wide Web Consortium</corpname>.
<pubdate>Winter, 1996</pubdate>
</bibliomset>.
</bibliomixed>
</bibliography>
a. Sect1…Sect5 元素 - 最常见的分节元素,可以在大多数组件级元素中出现。这些编号的节元素必须正确嵌套(Sect2s 只能出现在 Sect1s 内部,Sect3s 只能出现在 Sect2s 内部,依此类推)。
b. Section 元素 - 作为编号节的替代方案,Section 是递归的,这意味着您可以根据需要将它们嵌套到任何深度。
c. SimpleSect 元素 - 一个终端节,可以在任何级别出现。SimpleSect 不能在其内部嵌套任何其他分节元素。
d. BridgeHead 元素 - 没有包含节的节标题
e. RefSect1…RefSect3 元素 - RefEntrys 中的编号节元素 f. GlossDiv、BiblioDiv 和 IndexDiv 元素 - 不嵌套
请参阅表 4 和表 5 以获取示例。
参考页面: http://www.oreilly.com/catalog/docbook/chapter/book/section.html
所有节级别及以上的元素都包含一个包装器,用于提供有关内容的元信息。元包装器的示例:BookInfo、ArticleInfo、ChapterInfo、PrefaceInfo、SetInfo、GlossaryInfo。
表 10:<bookinfo> 元素
<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<bookinfo>
<title>XML – Managing Data Exchange</title>
<authorgroup>
<author>
<firstname>Richard</firstname>
<surname>Watson</surname>
</author>
<author>
<firstname>Hendrik</firstname>
<surname>Fischer</surname>
</author>
<author>
<firstname>Rusen</firstname>
<surname>Gul</surname>
<affiliation>
<orgname>University of Georgia</orgname>
</affiliation>
</author>
</authorgroup>
<edition>Introduction to XML - Version 1.0 </edition>
<pubdate>1997</pubdate>
<copyright>
<year>1999</year>
<year>2000</year>
<year>2001</year>
<year>2002</year>
<year>2003</year>
<holder> O'Reilly & Associates, Inc. </holder>
</copyright>
<legalnotice>
<para>Permission to use, copy, modify and distribute the DocBook
DTD and its accompanying documentation for any purpose and without
fee is hereby granted in perpetuity, provided that the above
copyright notice and this paragraph appear in all copies.
</para>
</legalnotice>
</bookinfo>
段落级元素有两类:块级 和 内联。
块级元素通常在它们之前和之后使用段落分隔符。大多数块级元素可以包含其他块级元素,许多块级元素可以包含字符数据和内联元素。块级元素的示例包括:段落、列表、侧边栏、表格和块级引用。
内联元素通常没有明显的断点。内联元素最常见的区别标志是字体更改,但内联元素可能根本没有视觉区别。内联元素包含字符数据,可能还包含其他内联元素,但它们绝不包含块级元素。它们用于标记数据。一些示例包括:交叉引用、文件名、命令、选项、下标和上标以及词汇表术语。
块级元素出现在组件和分节元素的正下方。
CalloutList | 一个标记列表,通常编号,并且通常在图形或逐字环境及其描述上。 |
GlossList | 词汇表术语及其定义的列表。 |
ItemizedList | 无序(带项目符号)列表。 |
OrderedList | 编号列表。 |
SegmentedList | 一组重复的命名项。例如,州及其首府的列表可以用 SegmentedList 表示。 |
SimpleList | 一个未修饰的项目列表。 |
VariableList | 术语及其定义或描述的列表。 |
表 11:<segmentedlist> 元素,“statecapital.xml”
<!DOCTYPE para PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<para>The capitals of the states of the United States of America are:
<segmentedlist>
<title>State Capitals</title>
<segtitle>State</segtitle>
<segtitle>Capital</segtitle>
<seglistitem>
<seg>Georgia</seg>
<seg>Atlanta</seg>
</seglistitem>
<seglistitem>
<seg>Alaska</seg>
<seg>Juneau</seg>
</seglistitem>
<seglistitem>
<seg>Arkansas</seg>
<seg>Little Rock</seg>
</seglistitem>
</segmentedlist>
</para>
表 12:“statecapital.xml” 输出
美国各州的首府为
州府
州:佐治亚州
首府:亚特兰大
州:阿拉斯加州
首府:朱诺
州:阿肯色州
首府:小石城
<small>Table 13: <orderedlist> element, "mashpotatoe.xml"</small>
<!DOCTYPE para PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<para>
<orderedlist numeration="upperroman">
<listitem>
<para>Preparation</para>
<orderedlist numeration="upperalpha">
<listitem><para>Chop tomatoes</para>
</listitem>
<listitem><para>Peel onions</para>
</listitem>
<listitem><para>Mash potatoes</para>
</listitem>
</orderedlist>
</listitem>
<listitem>
<para>Cooking</para>
<orderedlist numeration="upperalpha">
<listitem><para>Boil water</para>
</listitem>
<listitem><para>Put tomatoes and onions in </para></listitem>
<listitem><para>Blanch for 5 minutes</para>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
</para>
表 14: “mashpotatoe.xml” 输出
I.准备
A.切碎番茄
B.剥洋葱
C.捣土豆泥
II.烹饪
A.烧水
B.放入番茄和洋葱
C.焯水 5 分钟
有五种类型的警告:警告、重要提示、注意、提示和警告。
<small>Table 15: <caution> element, "caution.xml"</small>
<!DOCTYPE caution PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<caution>
<title>This is a caution</title>
<para>Be careful while opening the box!</para>
</caution>
特定行环境 保留空白和换行符。
Address | 实际地址,通常是邮政地址 |
LiteralLayout | 一段文本,其中换行符和空白将被忠实地复制 |
ProgramListing | 程序的全部或部分的逐字列表 |
Screen | 用户在计算机屏幕上看到或可能看到的文本 |
ScreenShot | 用户在计算机屏幕上看到或可能看到的屏幕的表示形式 |
Synopsis | 一个用于表示命令或函数语法的通用元素 |
表 16:<literallayout> 元素,“If_by_Kipling.xml”
<!DOCTYPE blockquote PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<blockquote>
<attribution>Rudyard Kipling,
<citetitle>If</citetitle>
</attribution>
<literallayout>
If you can force your heart and nerve and sinew
To serve your turn long after they are gone,
And so hold on when is nothing in you
Except the Will
which says to them:
Hold on!
</literallayout>
</blockquote>
常见的块级元素 包括示例、图形和表格。正式元素和非正式元素的区别在于,正式元素有标题,而非正式元素没有标题。
Example、InformalExample
表 17:<example> 元素
<!DOCTYPE example PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<example>
<title>Sample code</title>
<programlisting>print "Hello, world!"</programlisting>
</example>
Figure、InformalFigure
表 18:<figure> 元素
<!DOCTYPE figure PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<figure>
<title>Revenues for Q1</title>
<mediaobject>
<imageobject>
<imagedata fileref="q1revenue.jpg" format="JPG"/>
</imageobject>
</mediaobject>
</figure>
Table、InformalTable
表 19:<table> 元素
<!DOCTYPE table PUBLIC "-//OASIS//DTD DocBook V4.2//EN"><br>
<table frame="frametype">
<title>frame="frametype"</title>
<tgroup cols="1">
<thead>
<row>
<entry>row 1, cell 1</entry>
<entry>row 1, cell 2</entry>
<entry>row 1, cell 3</entry>
</row>
</thead>
<tbody>
<row>
<entry>row 2, cell 1</entry>
<entry>row 2, cell 2</entry>
<entry>row 3, cell 3</entry>
</row>
</tbody>
</tgroup>
</table>
段落 是 Para、SimPara(简单段落可能不包含其他块级元素)和 FormalPara(正式段落有标题)。段落是最常用的高级元素,可以包含块级元素,例如 itemizedlist 和 Mediaobject,并且可以包含几乎所有内联元素。
参考页面: http://www.docbook.org/tdg/en/html/para.html
表 20:<para> 元素,“Nietzsche.xml”
<!DOCTYPE para PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<para>
<quote>Behold the superfluous. They are always sick. They vomit their gall and call it a newspaper.</quote>
-Friedrich Wilhelm Nietzsche,
<citetitle>Twilight of the Idols</citetitle>
</para>
Equation 和 InformalEquation(无标题)
表 21:<informalequation> 元素在 <para> 元素内部
<!DOCTYPE para PUBLIC "-//OASIS//DTD DocBook V3.1//EN"> <para>
The equation
<informalequation>
<alt>e^(pi*i) + 1 = 0</alt>
<graphic fileref="figures/epi10"></graphic>
</informalequation>
is delightful because it joins together five of the most important mathematical constants.
</para>
InlineGraphic、MediaObject、InlineMediaObject
这些元素可以包含视频、音频、图像和文本数据。单个媒体对象可以包含几种备用形式,从中演示系统可以选择最合适的对象。
请参阅表 18 以获取示例。
在已发布的文档中,内联元素通常会导致字体更改或其他细微更改,但不会导致行或段落断开。
Abbrev | 缩写,尤其是带句号的缩写。 |
Acronym | 通常可发音的单词,由名称或短语的首字母(或选定字母)组成。 |
Emphasis | 强调的文本。 |
Footnote | 脚注。脚注元素的位置标识脚注的第一次引用的位置。可以使用 FootnoteRef 插入对同一脚注的额外引用。 |
短语 | 一段文本。 |
引用 | 内嵌引用。 |
商标 | 商标。 |
引用 | 对另一出版作品的内嵌参考文献。 |
词汇术语 | 词汇术语。 |
链接 | 超文本链接。 |
ULink | 通过 URL(统一资源定位符)定位目标的链接。 |
交叉引用 | 对文档其他部分的交叉引用。 |
外语短语 | 文档主要语言之外的单词或短语。 |
计算机输出 | 计算机显示或呈现的数据,通常是文本。 |
标记 | 文本中要逐字表示的格式化标记字符串。 |
可替换 | 用户可以或必须替换的内容。 |
用户输入 | 用户输入的数据。 |
字面量 | 内嵌文本,是某个字面量。 |
命令 | 可执行程序或其他软件命令的名称。 |
消息文本 | 消息集中消息组件的实际文本。 |
可选 | 可选信息。 |
电子邮件 | 电子邮件地址。 |
数据库 | 数据库或数据库部分的名称。 |
文件名 | 文件的名称。 |
标记 | 信息单元。 |
类型 | 值的分类。 |
应用程序 | 软件程序的名称。 |
特殊字符的实体
以下实体用于特殊字符
字符 | 实体 |
< | & lt; |
> | & gt; |
& | & amp; |
" | & quot; |
' | ' |
DSSSL 与 XSL 样式表
文档样式语义和规范语言(DSSSL) 是一种适用于打印和在线呈现的样式表语言。它主要用于与 SGML 协作。
可扩展样式表语言(XSL) 是一种用于表达用 XML 编写的样式表的语言。它包含格式化对象语言,但引用单独的文档来表示转换语言和路径语言。在本章中,我们将使用 XSL 样式表,因为它们功能更强大,您已经熟悉它们,并且它们用于与 XML 协作。
DocBook 严格区分文档的内容和外观。DocBook 文档只解释文档的语义,而不是其格式或外观。为了发布您的 DocBook 文档,您需要使用一组描述格式的 DSSSL 或 XSL 样式表,以及一个 XSL 处理器。
如果您认为编写自己的 XSL 样式表会很费力,您是对的。好消息是您不必这样做。对于 DocBook,有大量免费提供的标准 XSL 样式表,主要由 Norman Walsh 维护。
请确保您从 Sourceforge.net - 样式表库 下载这些样式表的最新版本。样式表分发包含一组模块化 XSL 文件,这些文件被组装成几个完整的 XSL 样式表。有一个样式表用于生成单个 HTML 文件,还有一个样式表用于从单个 DocBook 文档生成多个较小的 HTML 文件。有用于打印输出、XHTML 输出、HTML 帮助输出和 JavaHelp 输出的样式表。由于所有主要计算机类型都有 XSL 处理器,您可以在 Unix、Linux、Windows 和 Macintosh 计算机上使用 DocBook。通过使用安装在系统上的这些默认样式表,创建自定义样式表非常容易。但是请记住,自定义样式表的常用方法是创建自定义层,而不是直接编辑它们。
要从 XML 文档发布 HTML,您需要一个 XSLT 引擎。要打印,您需要一个 XSLT 引擎来生成格式化对象 (FO),然后必须使用 FO 引擎处理这些对象以生成 PostScript 或 PDF 输出。有各种 XSLT 引擎可用。以下是一些您可以考虑的免费/开源引擎。请注意,xsltproc 和 Saxon 目前是唯一推荐与 DocBook 一起使用的 XSLT 引擎。
- Xsltproc: 一个用 C 编写的免费处理器,作为 Gnome 开发项目提供的开源 libxml2 库的一部分。它被认为是最快的处理器之一,并且高度符合规范。从 http://xmlsoft.org/XSLT/ 下载。
- Saxon: 一个用 Java 编写的免费处理器,可以在任何具有现代 Java 解释器的操作系统上运行。它在内部使用 Aelfred XML 解析器,该解析器有一些错误,因此许多人用 Xerces 解析器代替。从 http://saxon.sourceforge.net/ 下载。
- Xalan: Xalan 是 Apache XML 项目的一部分。它有使用 Java 和 C++ 编写的版本,两者都是免费的。Java 版本高度可移植并且开发得更完善。通常,Xalan 与 Xerces XML 解析器(Java 或 C++)一起使用,也可以从 Apache XML 项目获得。从 http://xml.apache.org/ 下载。
您对 XSLT 引擎的选择可能很大程度上取决于您运行引擎的环境。许多需要或想要非 Java 应用程序的 DocBook 用户使用 xsltproc。它非常快,并且开发人员对错误报告和问题响应非常快。但是 xsltproc 目前的局限性之一是它还不支持 Norm Walsh 的 DocBook 特定 XSLT 扩展函数。
Saxon 是 Java 环境中最流行的引擎。它还支持 Norm Walsh 的 DocBook 特定 XSLT 扩展函数。
NetBeans IDE 是我们一直在使用的用于其他章节练习的 XML 编辑器,默认情况下,它内置了使用 XALAN 解析器的 XSLT 处理器。NetBeans IDE 不仅允许您验证 XML 文档,而且还可以在 IDE 中直接执行 XSL 转换。它足够满足本章的用途。不过,它没有提供任何 XSLT 调试功能,因此您可能需要为严肃的 XSLT 工作获取一个不错的 XSL IDE(例如,XML Spy 或 Xcelerator)。
对于从 FO 文件生成打印/PDF 输出,有两个免费/开源的 FO 引擎
- PassiveTeX: 可在 http://www.tei-c.org.uk/Software/passivetex/index.xml.ID=body.1_div.1 获取。下载和安装信息在 http://www.tei-c.org.uk/Software/passivetex/index.xml.ID=body.1_div.3 获取。
- FOP: Apache XML 项目的基于 Java 的处理器,可在 http://xml.apache.org/fop/ 获取。
- 标准样式表的主要优势是它们易于自定义。
- 在 params.xsl 中找到的参数
- 调用您的自定义层,而不是标准样式表
表 22:自定义 XSL 样式表,“myxsl1.xsl”
<?xml version="1.0"?>
<!-- Customization layer -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<nowiki><!-- Use 'chunk.xsl' in line below to chunk files. --></nowiki>
<xsl:import href="/usr/share/sgml/docbook/docbook-xsl-1.51.1/html/docbook.xsl"/>
<xsl:param name="chapter.autolabel" select="1"/>
<xsl:param name="section.autolabel" select="1"/>
<xsl:param name="section.label.includes.component.label" select="1"
doc:type="boolean"/>
<!-- Insert more parameters here. -->
</xsl:stylesheet>
- 除了设置参数外,您还可以修改 XSLT “模板”来覆盖默认行为
- 您至少需要了解 XSLT 的基本知识
表 23:自定义 XSL 样式表,“myxsl2.xsl”
<xsl:template match="emphasis">
<xsl:choose>
<xsl:when test="(@role='strong') or (@role='bold')">
<xsl:call-template name="inline.boldseq"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="inline.italicseq"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
它通常需要一个两阶段过程
- 从 XML 生成 FO
- 从 FO 生成 PDF
表 24:用于生成 FO 的 XSL 样式表,“myxsl3.xsl”
xsltproc -o sample.fo $DB/fo/docbook.xsl sample.xml fop.sh -fo sample.fo -pdf sample.pdf
a. 幻灯片文档类型
- 从 DocBook XML 创建演示文稿幻灯片
- 您可以创建 HTML(带或不带框架)和 FO
- 在特定层次结构框架中使用 DocBook 元素
- 可从 SourceForge 上的 DocBook 开放式存储库下载
表 25:“slides.xml”
<!DOCTYPE slides SYSTEM "/usr/share/sgml/docbook/xsl-slides-1.1/slides.dtd">
<slides>
<slidesinfo>
<title>A Simple Approach to DocBook</title>
</slidesinfo>
<foil>
<title>My first slide</title>
<itemizedlist>
<listitem><para>...</para></listitem>
<listitem><para>...</para></listitem>
<listitem><para>...</para></listitem>
</itemizedlist>
</foil>
<foil>
<title>My second slide</title>
<para>... </para>
</foil>
</slides>
b. 网站文档类型
- 从 DocBook XML 文件集合创建网站
- 在特定框架中使用大多数 DocBook 元素。它有单独的文件来控制页面导航和层次结构。
- 可从 SourceForge 上的 DocBook 开放式存储库下载。
表 26:“website.xml”
<!DOCTYPE webpage SYSTEM "../website.dtd" [
<!NOTATION XML SYSTEM "xml">
<!ENTITY test1a SYSTEM "test1a.xml" NDATA XML>
<!ENTITY test3 SYSTEM "test3.xml" NDATA XML>
<!ENTITY about.xml SYSTEM "about.xml" NDATA XML>]>
<webpage id="home">
<config param="desc" value="The Test Home Page"/>
<config param="rcsdate" value="$Date: 2001/11/08 20:44:20 $"/>
<config param="footer" value="about.html" altval="About..."/>
<head>
<title>Welcome to Website</title>
<summary>Introduction</summary>
<keywords>Rusen Gul, XSL, XML, DocBook, Website</keywords>
</head>
<para> This website demonstrates the DocBook.</para>
<webtoc/>
<section>
<title>What is a Website?</title>
<para>A website is a collection of pages organized, for the purposes of navigation, into one or more hierarchies. In Website, each page is a separate XML document authored according to the Website DTD, a customization of <ulink url="http://www.oasis-open.org/docbook/">DocBook</ulink>.</para>
</section>
</webpage>
这看起来确实工作量很大,不是吗?你说得没错。那我们为什么要费心使用 DocBook 呢?
- 它具有可移植性!用 DocBook 标记编写的文档可以轻松快速地转换为 HTML、PostScript、PDF、RTF、DVI、纯 ASCII 文本,而且不需要任何昂贵的工具。
- 它很灵活!它能够输出多种格式,包括 HTML、PDF、幻灯片等等。
- 它将内容与格式分开!DocBook 只关注文档的结构。它使作者不必担心文档的格式和布局。
- 它易于理解!大多数 DocBook 元素都是自解释的。
- 它可以处理大量内容。你可以将文档在物理上分成不同的文件,并分别方便地对它们进行处理。
- 它是免费的!有很多免费的开源工具可用于处理 DocBook。
DocBook 很适合任何定期维护和发布的技术文档集。多个作者可以贡献到一个文档中,并且他们的内容可以轻松合并,因为所有作者都使用高度结构化的标准标记语言。只需要记住一点:由于 DocBook 文档的格式是严格由样式表完成的,因此 DocBook 不太适合高度设计的布局驱动内容(如杂志)。
建立 DocBook 系统肯定需要一些时间和精力。回报将是一个高效、灵活且廉价的发布系统,它是迭代的,并且可以随着你的需求而增长。因此,它是值得努力的!
该项目的目的是使用 OpenOffice.org 作为 XML 内容的所见即所得编辑器,使用样式编辑结构化文档。导出时,这些样式将被转换为 XML 标记。本节将向你展示如何启用和使用 DocBook 过滤器。以下是可用于下载最新转换的样式表的链接。
有三种不同的方法可以启用 DocBook 过滤器。
- 下载 DocBook XSLT 样式表和 OpenOffice.org 样式模板
- 使用这种方法将确保使用最新的样式表和 OpenOffice.org 样式模板来导入和导出。需要下载以下内容才能在 OpenOffice.org 中导入、导出和修改 DocBook 文档。
- 用于 XML 转换的相关 XSLT 样式表 (全部可在此处获取)
- 一个 OpenOffice.org 样式模板,其中包含对应于 DocBook 标记的自定义样式 (在此处获取)
最新的样式表支持导入和导出以 article 或 chapter 作为顶级标记的 DocBook 文档。以下列出了每个操作所需的不同的样式表。
- 用于导入 Article 的样式表 docbooktosoffheadings.xsl
- 用于导入 Chapter 的样式表 docbooktosoffheadings.xsl
- 用于导出 Article 的样式表 sofftodocbookheadings_article.xsl
- 用于导出 Chapter 的样式表 sofftodocbookheadings_chapter.xsl
用于 Article 和 Chapter 文档的 OpenOffice.org 模板
- DocBookTemplate.stw
创建新的 DocBook 过滤器
- 转到工具 -> XML 过滤器设置...
- 将过滤器名称和文件类型名称设置为 DocBook(Chapter)
- 转到转换选项卡
- 将 DocType 设置为 <chapter>
- 对于导出 XSLT,请浏览到 chapter 导出样式表 (docbooktosoffheadings.xsl)。
- 对于导入 XSLT,请浏览到 chapter 导入样式表 (sofftodocbookheadings_chapter.xsl)。
- 对于导入模板,请浏览到样式模板 (DocBookTemplate.stw)。
- 单击确定,并关闭 XSLT 过滤器设置对话框
要创建 DocBook Article 过滤器,可以重复上述步骤,将 chapter 替换为 article。
- 下载 DocBook XSLT Jar 包(用于 Article 或 Chapter)
这种方法更方便,但不能保证使用的是最新的样式表和 OpenOffice.org 模板。
- 仅下载 DocBook UNO 组件(用于 Article)
DocBook UNO 组件为保留未解析的 XML 实体添加了过滤器支持。
- 下载 DocBookFilter
- 将它解压缩到 <OOo 安装目录>/
- 在 <OOo 安装目录>/program 目录中运行 pkgchk
- 现在,DocBook Article 过滤器将以 OpenOffice.org 设置变量的形式导入 DocBook 未解析实体。
现在可以使用文件 -> 打开对话框打开 DocBook article 或 chapter 文档。
- 转到文件 -> 打开...
- 浏览到 DocBook 文档。
- 单击确定
DocBook XSLT 过滤器应该会自动确定文档的根元素,并使用匹配的 XSLT 过滤器导入它。或者,也可以在文件 -> 打开对话框的文件类型组合框中手动浏览到所需的 DocBook 过滤器。
也可以使用文件 -> 另存为对话框导出 DocBook 文档。
- 转到文件 -> 另存为...
- 浏览到要保存文档的位置
- 单击保存
同样,DocBook XSLT 过滤器应该会自动确定文件类型,并使用匹配的 XSLT 过滤器进行导出。或者,也可以在文件 -> 另存为对话框的文件类型组合框中手动浏览到所需的 DocBook 过滤器。
使用 OpenOffice.org 样式表示 DocBook 标记 样式模板提供了当前支持的所有自定义样式。将 DocBook 文档导入 OpenOffice.org 后,可以使用样式表查看可用的 DocBook 特定样式。导入时,每个支持的 DocBook 标记都将映射到格式化的 OpenOffice.org 内容。同样,要修改导入的 DocBook 文档,可以使用 OpenOffice.org 文本样式来表示标记文本的 DocBook 标记。注意:可以通过打开 DocBookTemplate.stw 在 OpenOffice.org 中创建一个新的 DocBook 文档。然后可以将该文档保存为 DocBook 文档,新内容将被表示为 DocBook 标记。如何创建新的 DocBook 内容
- 按 F11 显示样式表
- 在样式表组合框中选择自定义样式
- 单击字符样式图标(样式表中从左侧数起的第二个图标)
- 双击 SubScript 样式
- 在 OpenOffice.org 文档中输入文本
- 导出为 DocBook 时,格式为 SubScript 自定义样式的文本将用 DocBook 标记 <subscript> 标记。
如何创建 DocBook 部分:最初,DocBook 项目使用 OpenOffice.org 部分来强制 DocBook 部分的嵌套。反馈表明,作者希望使用常见的文字处理样式,例如 Heading1、Heading2 等。以下说明描述了如何创建包含 <sect2> 的 <sect1>。
- 按 F11 显示样式表
- 在样式表组合框中选择所有样式
- 单击段落样式图标(样式表中从左侧数起的第一个图标)
- 双击 Heading 1 样式
- 输入要作为 <sect1> 标题的文本
- 此标题下方的所有文本现在将成为 DocBook <sect1> 的内容
- 输入其他 DocBook 样式、表格等
- 输入要包含在 <sect1> 中的其他 DocBook 样式、表格等
- 双击 Heading 2 样式
- 输入要作为 <sect2> 标题的文本
- 此标题下方的所有文本现在将成为 DocBook <sect2> 的内容
- 输入要包含在 <sect2> 中的其他 DocBook 样式、表格等
- 使用 OpenOffice 标题嵌套 DocBook sect 可以一直到 <sect4> / Heading 4
在文档中导航:如果希望查看 DocBook 部分是如何作为 OpenOffice.org 标题嵌套的,请使用 F5 键显示导航器窗口。展开标题标记,以显示文档中标题的布局。可以通过双击某个 DocBook 部分/OpenOffice.org 标题,跳到该部分/标题的开头。
- 从 http://www.oasis-open.org/docbook/xml/ 下载最新的 DocBook DTD。将本书第 2 章的学习目标部分转换为 DocBook 文档。检查它是否格式正确且有效。
- 从 Sourceforge.net 下载 DocBook XSL 样式表。使用 HTML 文件夹中的 docbook.xsl 样式表,将您在第一个练习中创建的 DocBook 文档转换为 HTML 文件。
- DocBook 官方网站
- DocBook: The Definitive Guide,作者 Norman Walsh 和 Leonard Muellner,由 O'Reilly & Associates 出版,1999 年 10 月 http://www.docbook.org/
- Sourceforge - DocBook 开放存储库
- 安装和使用 DocBook - 版权所有 2002,伯明翰大学
- 使用 DocBook XSL 样式表 - http://www.sagehill.net/docbookxsl/index.html
- 为 Windows 和 Unix 设置免费的 XML/SGML DocBook 编辑套件
- http://lists.oasis-open.org/archives/docbook-apps/
- http://www.dulug.duke.edu/~mark/docbookmarks/
- http://www.linuxdoc.org/LDP/LDP-Author-Guide/
- http://www.nwalsh.com/docs/
- http://www.e-smith.org/docs/docprocess.html
- http://www.lodestar2.com/people/dyork/talks/docbook/
- DocBook 邮件列表:mailto:[email protected]
- http://xml.openoffice.org/xmerge/docbook/