DocBook学习笔记 之 建立Docbook开发环境

DocBook学习笔记

注意:这篇文档本身就是用DocBook编写的,在这里显示有些问题,详细内容请访问:http://cheapsat.512j.com/article/docbook/docbook_index.html

摘要:

最近比较闲,因此花了几天时间把早就想学习的DocBook研究了一下。 由于DocBook是XML的一种方言,而我对XML又不是很熟悉,因此 在配置环境时遇到了不少困难,其中既有XML的问题,又有开发工具的问题, 还有中文处理时的一些问题。好在经过几天痛苦的配置,在看了几本书、若干 份教程和许多篇Blog之后,总算基本把开发环境搭好了,在处理中遇到的种种 问题也基本都解决了。 在这个过程中,我感觉学到了不少东西,这里把我的心得体会记录下来,既做 一个备忘,又能给其他学习DocBook的朋友带来一些帮助,也能希望有高手 能够指出我做的不对的地方,并帮我解决一下现在依然存在的问题。

详细内容:

[单页HTML][多页HTML][PDF][CHM]

<script language="JavaScript" charset="gb2312" type="text/javascript" src="http://www1.itsun.com/counter.php?uuid=1460622&style=icon"></script>

=============================================================

下面是原文的纯文本版本:

=============================================================

DocBook学习笔记DocBook学习笔记
发布时间:2006-07-06 23:08:32 星期四
版权 ?? 2006 张弛
      修订历史
      修订 v1.0.02006-06-09zhc
      最初版本




目录
  前言
  1. DocBook概述
    1.1. DocBook是什么
    1.2. 这篇笔记讲什么
    1.3. 这篇笔记不讲什么
    1.4. 这篇笔记的组织
  2. DocBook的工具链
    2.1. DocBook工具链的组成
    2.2. 工具链组件的结构和作用
      2.2.1. 文本编辑器
      2.2.2. DocBook DTD 文件
      2.2.3. DocBook XSL 文件
      2.2.4. XSLT处理器
      2.2.5. XML catalog 文件
      2.2.6. XML校验工具
      2.2.7. XSL-FO处理器
      2.2.8. 自动构建工具
      2.2.9. 总结
    2.3. 工具链组件的比较和选择
      2.3.1. 文本编辑器
      2.3.2. DocBook DTD文件
      2.3.3. DocBook XSL文件
      2.3.4. XSLT处理器
      2.3.5. XML校验工具
      2.3.6. XSL-FO处理器
      2.3.7. DocBook自动构建工具
      2.3.8. 总结
  3. 在Linux系统上建立DocBook开发环境
    3.1. 文本编辑器
    3.2. DocBook DTD 文件
    3.3. DocBook XSL 文件
    3.4. XML catalog 文件
    3.5. XSLT处理器
    3.6. 第一次测试
    3.7. XSL-FO处理器
    3.8. 编写Makefile
    3.9. 第二次测试
  4. 在Windows??系统上建立DocBook开发环境
    4.1. 规划目录结构
    4.2. DocBook DTD 文件
    4.3. DocBook XSL 文件
    4.4. XML catalog 文件
    4.5. XSLT处理器
    4.6. XSL-FO处理器
  5. 其他工具链组件
    5.1. Saxon
    5.2. Xalan
    5.3. XEP
插图清单
  2.1. DocBook XML工具链组成
  2.2. DocBook XML和SGML工具链组成
表格清单
  2.1. DocBook工具链的组成
  2.2. 我选择的DocBook工具链
前言
最近比较闲,因此花了几天时间把早就想学习的DocBook研究了一下。
由于DocBook是XML的一种方言,而我对XML又不是很熟悉,因此 在配置环境时遇到了不少困难,其中既有XML的问题,又有开发工具的问题,
还有中文处理时的一些问题。好在经过几天痛苦的配置,在看了几本书、若干 份教程和许多篇Blog之后,总算基本把开发环境搭好了,在处理中遇到的种种
问题也基本都解决了。
在这个过程中,我感觉学到了不少东西,这里把我的心得体会记录下来,既做 一个备忘,又能给其他学习DocBook的朋友带来一些帮助,也能希望有高手
能够指出我做的不对的地方,并帮我解决一下现在依然存在的问题。
第 1 章 DocBook概述
目录
  1.1. DocBook是什么
  1.2. 这篇笔记讲什么
  1.3. 这篇笔记不讲什么
  1.4. 这篇笔记的组织
1.1. DocBook是什么
DocBook是一种面向语义的文档标记语言。与大多数常用的所见即所得的字处理程序有着很大的不同。
首先,DocBook是一种标记语言,它看起来有点像HTML,完全是由透明的纯文本和各种各样的标签构成的,
而不是神秘的二进制格式;其次,DocBook是一种面向语义的语言,它所有的标签都只包含语义信息,
如“这段文字表示一个邮件地址,那段文字表示一段程序代码”,而不含有任何的排版信息,如“字体”、“颜色”。
关于DocBook是什么,不是什么,在网络上可以找到很多的信息,这里我就不重复了。
1.2. 这篇笔记讲什么
根据我的经验,DocBook的概念和标签的使用都不难掌握,一般花上1个小时,看几篇教程,
就可以掌握常用的标签并开始使用DocBook写作了。DocBook应用的主要困难在于环境的配置,
一方面,DocBook的开发环境需要涉及到许多种不同的软件、各式各样的配置文件、五花八门的
参数选项,往往令新手无所适从;另一方面,DocBook现有的工具基本都是由西方开发的,
在处理中文时,往往会出现这样或那样的问题,因此用DocBook生成漂亮的中文文档就更是难上加难。
基于这些原因,在这篇笔记中,讲述的重点将放在DocBook开发环境的构建, 和解决处理中文时可能遇到的问题这两个方面。
1.3. 这篇笔记不讲什么
首先,这篇笔记不会涉及DocBook的语法。 关于DocBook的详细语法定义,可以在它的官方网站 找到一本叫做DocBook: The Definitive
Guide 的书,这本书可以免费在线阅读。 只要懂一点正则表达式的概念,就可以很容易看懂其中的语法定义。
其次,这篇笔记不会涉及DocBook的SGML版本。 DocBook实际上有两个版本:SGML版本和XML版本,但在这篇笔记里只会涉及XML版本相关的内容。
如果你对SGML版本感兴趣,可以参考Jims的 笔记。
1.4. 这篇笔记的组织
[todo]
第 2 章 DocBook的工具链
目录
  2.1. DocBook工具链的组成
  2.2. 工具链组件的结构和作用
    2.2.1. 文本编辑器
    2.2.2. DocBook DTD 文件
    2.2.3. DocBook XSL 文件
    2.2.4. XSLT处理器
    2.2.5. XML catalog 文件
    2.2.6. XML校验工具
    2.2.7. XSL-FO处理器
    2.2.8. 自动构建工具
    2.2.9. 总结
  2.3. 工具链组件的比较和选择
    2.3.1. 文本编辑器
    2.3.2. DocBook DTD文件
    2.3.3. DocBook XSL文件
    2.3.4. XSLT处理器
    2.3.5. XML校验工具
    2.3.6. XSL-FO处理器
    2.3.7. DocBook自动构建工具
    2.3.8. 总结
2.1. DocBook工具链的组成
为了构建一个完整的DocBook开发环境,我们需要下面表格中列出的一系列工具和文件,
其中标明“必备”的,是必须要安装和配置的,其它的则只有当你需要实现特定的功能时才需要。
表 2.1. DocBook工具链的组成
      工具必备说明
      支持UTF-8编码的文本编辑器是最好还能够支持DocBook语法高亮
      DocBook XML DTD 定义文件是
      DocBook XSL 样式表文件是
      XML catalogs文件否如果想写出的源文件具有比较好的可移植性,则需要它
      XML校验工具否如果想写出完全符合标准的DocBook文件,则需要它
      XSLT处理器是
      XSL-FO处理器否如果要生成ps、pdf格式的文件,则需要它
      TrueType或PostScript格式的矢量字体否如果要生成中文pdf文件,则需要它
      DocBook自动构建工具否可以是一个Makefile文件,或是一段shell脚本, 它可以让输出文件的生成更方便
      HTML CSS 样式表文件否如果想自定义生成的HTML文件的样式,则需要它



这些工具看起来很杂乱,五花八门什么都有,实际上它们是有很多内在的联系的, 在下一小节,将讲述各个工具的在整个工具链中的作用以及它们之间的关系。
2.2. 工具链组件的结构和作用
在涉及具体的工具之前,让我们先来看一下当我们使用DocBook来完成一份文档时,最典型的工作流程。 以便对整个开发环境有一个整体的认识。
首先,我们需要打开文本编辑器,按照DocBook所规定的语法和格式,完成一份符合DocBook规范的
XML文档。如果包含中文,则需要把文件用UTF-8编码保存,并在文件头的声明处写明使用的编码。
接着,为了确定我们的文件是不是完全符合XML和DocBook的规定,我们需要使用一个XML校验工具对文件进行检查。
校验工具首先会检查文件是不是一份合法的XML文件,如果通过,则还会根据在文件头声明的DTD定义文件,检查文档中
的各个标签的使用是不是符合DTD文件中的声明。如果检查都通过了,则我们的文件肯定是一份100%符合标准的DocBook文档。
如果检查时出现了错误,也不要担心,XML语言很简单,通过查看错误信息并参考DocBook: The Definitive Guide,错误也很容易发现。
对于一份合法的DocBook文档,我们就可以开始转换了。首先我们使用XSLT处理器将DocBook
文档转换为html和fo格式的文档。XSLT处理器读入我们的DocBook源文件,和每种格式对应的XSL描述文件,
然后根据XSL文件中的描述,将我们的xml源文件转换为另一种结构化的描述文件。 这里我们转换了两种:html,就是常见的网页格式,是一种典型的结构化描述语言;
fo,这种格式与我们的DocBook类似,也是一种XML方言,不过这种格式是专供印刷使用的,里面的标记全都是排版信息 (与DocBook的语义标签正好相反)。
至此,我们已经成功的将DocBook文档转化成了web页面。如果我们还想进一步得到ps或pdf格式的文档以便打印,
则我们还需要使用XSL-FO处理器,将刚刚生成的fo格式的文档再转换为ps或pdf格式的文档。
一个典型的DocBook文档工作流程就是这样的了。注意我们只写了一份XML源文件,但通过不同工具的处理,
我们得到了适合于web发布的html文件,也得到了适合于传播和打印的pdf文件,如果我们愿意, 还可以很方便的获得适合于Microsoft
Word字处理程序的doc文件、适合于Windows??系统的chm帮助文件、
适合于Java??系统的JavaHelp帮助文件、适合于Unix系统的manpage手册文件……
这就是DocBook的特点:一次编写,到处发布。
下面,将详细介绍整个开发工具链中的每个组件的作用,以及它们之间的关系。
2.2.1. 文本编辑器
文本编辑器是DocBook文档写作过程中用的最多的工具,作用就是编辑我们的DocBook源文件。
当然,在配置开发环境时,我们也许要用它来编辑各种各样的配置文件。
2.2.2. DocBook DTD 文件
DTD 是 Document Type Definition (文档类型定义)的缩写,它的作用是声明和定义在一份XML文件中,
可以出现那些元素,并且这些元素应该如何被组织和使用。我们的DocBook DTD就是用来定义一份DocBook文档中,
各个元素应该被如何使用的。前面我们提到过得xml校验工具就是利用DTD文件来检查我们的文档是否正确的。
那么DTD文件如何使用呢?
在每一个DocBook源文件中,我们都可以看到类似下面这样的一句话:
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
      这句话就是在告诉处理程序,这份XML文档要使用哪一份DTD定义文件, 其中的“-//OASIS//DTD DocBook XML
V4.4//EN”和“http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd” 就是DTD文件的名字。
前面那个叫做公共名,是一个特定的DTD文件的唯一的标识字符串。
后面那个叫做系统名,表示我们的DTD文件所存放的位置。这个位置可以是任何一个有效的URL, 因此它既可以是一个本地的路径,如:
"file:///usr/share/sgml/docbook/xml-dtd-4.4-1.0-25/docbookx.dtd"
"file://C:/docbook/dtd/docbookx.dtd"
    也可一是一个指向网络的路径,如:
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
    事实上,我们最好总是把系统名写成第二种形式,因为这样可以获得最好的可移植性。
当我们使用工具进行文档的校验和转换时,我们可以通过后面将要提到的catalog文件, 将一个网络路径映射为本地路径,以避免网络下载所带来的速度问题。
2.2.3. DocBook XSL 文件
XSL的全称是 Extensible Stylesheet Language (可扩展样式表语言),它是由W3C组织定义的一种用来解释样式表的语言。
它的主要作用是用来描述如果把格式信息应用到一个XML文件上,这样就可以把文档的内容和形式分开,内容由xml文件决定,而 形式由xsl文件决定。
在DocBook的标准XSL文件中,实际上是包含了几套不同的XSL样式表,有的用来转换为html,有的用来转换为xhtml,
还有的用来转换为rtf等等。但注意一点,XSL本质上只能把一种标记语言转换为另一中标记语言,因此,
为了得到二进制的输出格式,我们就得借助一些中间格式。例如:为了得到pdf,我们得借助于前面提到过的fo; 为了得到doc,我们得借助rtf。
XSL只是一种解释性的语言,类似脚本,它并不能直接处理和转换XML文件,为了转换XML文件, 我们必须借助能够解释并执行XSL语言的工具:XSLT处理器。
2.2.4. XSLT处理器
XSLT是 XSL Transformation (XSL转换)的缩写,它也是属于XSL语言定义的一部分,其作用是将xml文件转换成html、
文本或另一种xml方言。XSLT处理器则是执行这种转换的工具。
XSLT处理器读入并解释输入的xsl源文件,然后根据文件内容的描述,对输入的xml源文件进行格式化和转换,
然后把转换的结果保存。根据xsl文件的不同,一个xml文件可能会产生多个文件的输出。
有一点值得注意的是,XSLT处理器在处理xml文件之前并不一定会对其进行校验,因此,
有些不是完全符合标准的xml源文件常常也能被XSLT处理器处理,并输出正确的结果。
2.2.5. XML catalog 文件
在第 2.2.2 节 “DocBook DTD 文件”中曾经提到过,
为了使写出的文档具有较好的可移植性,我们总是应该将DTD声明中系统名的URL写成网络路径而不是本地路径。
因为网络路径是非常稳定的,而本地路径则会因环境的不同而变化。写成网络路径,就不用因为实际环境中DTD文件路径的变化,
而去修改每个源文件了(如果源文件只有几个,这看起来还不是什么问题,但是想象一下, 假如你要维护的是一份由几百份文件构成的大型文档,那简直就是一个噩梦……)。
使用了网络DTD路径之后,移植的问题就迎刃而解了,因为现在的xml处理程序都非常聪明,
知道如何从网络去下载它所需要的文件,并进行解析。但是这又同时引出了另一个问题,
那就是网络的速度常常会很慢,如果每次用到DTD文件都从网络下载的话,大部分的处理时间都将浪费在网络传输上, 更何况有时可能根本就无法访问网络。
那么,如何才能同时获得移植性和访问速度这两种优点呢?答案就是使用XML catalog文件。
catalog文件实际上也是一种XML方言。它的作用是在一个通用网络地址和一个特定主机的本地目录间建立一个映射关系。
当一个支持catalog的处理程序在处理一个网络地址时,它首先会查询catalog文件,看看是否在其中存在指向本地目录的映射,
如果存在,它就会用指定的本地路径去代替网络路径。而只有当映射关系不存在,或者映射的本地路径无法访问时,
处理程序才会去访问真正的网络路径。因此,有了catalog文件,我们就可以放心大胆的在XML中、Makefile中、shell脚本中
使用通用的网络路径了。当换了一个环境,我们只需重新配置一下新环境下的catalog文件就可以了,已经写好的源文件 不需要做任何改动。
catalog文件不仅可以用于指定DTD文件,还可以用来指定entity文件、XSL文件等
XML catalog文件的标准和详细细节可以参考 XML Catalogs: Committee Specification 06 Aug 2001。
另外,DocBook XSL: The Complete Guide这本书中也讲述了catalog相关的内容,虽然不全面,但是浅显易懂并且也足够用了。
2.2.6. XML校验工具
XML校验工具的作用就是检查我们写的XML源文件是不是完全符合它所声明要遵循的DTD规范。
由于是专用的校验工具,因此这类程序在检查时往往比较严格。有时像XSLT处理器这类程序往往会放过
不是特别严重的问题,而专用的校验工具则会一个不漏的检查出来,并且还会对一些可能是出错的地方提出警告。
因此,如果可能,最好还是让我们的源文件能够通过检查,这样,可以保证我们的源文件100%正确,
可以防止这个处理程序能处理,那个处理程序就处理不了了的问题。有助于提高可移植性。
2.2.7. XSL-FO处理器
前面我们提到过,为了获得像pdf这样的适用于印刷的文件格式,我们需要借助于一个中间格式fo, 先利用XSLT处理器将DocBook
XML转换为另一种专为格式化和排版设计的XML方言FO(Formatting Objects)。
那么,当我们得到了所需要的fo文件之后,又要如何处理呢?这时,就需要用到XSL-FO处理器了。
XSL-FO处理器实际上是一种排版引擎。它读取fo文件中的文字信息和格式化标记,对这些信息进行处理、
布局和排版,最后输出PostScript??或PDF??这样的可以直接被打印输出的硬拷贝文件。
2.2.8. 自动构建工具
由于DocBook的工具链包含很多不同的工具,而我们在创作DocBook文档时也常常需要一个
“编辑->转换->检查->修改”的循环,这很像是程序开发的流程。因此我们很自然的想到, 可以借助于在程序开发时的各种自动化处理工具来简化我们的工作。
比如,我们可以写一段shell脚本或批处理程序来代替每次敲入冗长的命令行。或者更进一步,
使用make程序来自动的检查文件间的依赖并进行转换。或者再进一步,写一个高度灵活但使用简单的外壳程序,
来帮我们调用各种工具并生成复杂的参数选项。甚至是在一些主流的IDE的基础上, 开发出专门用来创作DocBook的集成开发环境。总之,能够减轻我们的琐碎工作就行。
2.2.9. 总结
前面各小结讲述了DocBook工具链中各组件的作用和关系。 整个工具链的主要结构参见下图:
图 2.1. DocBook XML工具链组成



这里还有一张图,同时包含了XML和SGML工具链组件,如果想了解SGML工具链的话, 可以作为一个很好的参考。
图 2.2. DocBook XML和SGML工具链组成



2.3. 工具链组件的比较和选择
由于DocBook本身就是一个非常开放的标准,并且也是最先在开源界得到广泛应用, 因此DocBook工具链的各个环节都可以找到许多相当成熟可靠的开源软件。
因为我也不可能把各种工具都试过,因此下面的比较和选择, 也都只限在我试用过的很有限的几个软件当中,并不一定真的是最好的。
对于一些我并不曾用过,但在网上道听途说也很不错的软件,我也尽量列出, 以供多一些选择。
2.3.1. 文本编辑器
可供我们编写DocBook使用的文本编辑器主要分为两种,一种是通用的纯文本编辑器, 另一种是专用的可视化编辑器。
对于纯文本编辑器,如果只是用来编辑英文文档的话,那么几乎任何一个都可以胜任。 但为了编辑中文DocBook文档,则最好还能满足下面几个要求:
  能够同时支持ASCII、GBK、UTF-8这三种编码,并能够自动检测和互相转换。
  由于在Windows??系统上中文使用的是GBK,而编写DocBook工具链中的许多工具都不支持GBK编码,
  而要求使用UTF-8编码,因此编辑器必须能够很好的支持这几种编码。对于Linux系统,
  通常中文环境本身就是zh_CN.UTF-8,因此不用过多的考虑编码的问题。
  能够支持CRLF、CR、LF几种换行符风格。
  由于几种主流的操作系统使用的换行符不同,为了使我们写出的DocBook源文件能够在各种系统上
  都能正常显示,编辑器最好能够自动检测和转换换行符。我的选择是使用Unix风格的LF作为换行符, 无论在什么操作系统上。
  支持DocBook语法高亮显示。
  这个功能不是必须的,但在使用时就会发现,如果我们的编辑器支持DocBook语法加亮,
那么可以很容易发现不匹配或拼写错误的标签,会给我们的写作带来很大的帮助。
基于以上几点需求,我们可以选则的编辑器有下面几种。
2.3.1.1. Vim
Vim应该是现在最流行的Vi编辑器的克隆版本了。它几乎可以在任何操作系统上使用,
能够很好的满足上面的几点需求,中文支持完美,而且自带DocBook语法加亮的功能, 是一个很好的选择。
Vim的主要问题在于,对于只在Windows??世界活动的人来说,它太难掌握了。
主页:
2.3.1.2. Emacs
又是一个全能型选手,同样能运行在各种操作系统,同样能很好的满足我们的需求, 而且似乎还有专门的DocBook模式(我不常用Emacs,不是很确定)。
它的问题也和Vim一样:不适合Windows??用户。
2.3.1.3. EditPlus
韩国人写的Windows??下的文本编辑器,对东亚语言支持自然很好。而且也支持UTF-8编码, 应该比较适合于Windows??用户使用。
EditPlus的问题主要是它是一个共享软件,使用是要收费的。
主页:www.editplus.com
2.3.1.4. Notepad++
Notepad++是一个开源的文本编辑器,看看它的名字就知道了,它的目标是想做一个更好的notepad。
Notepad++支持我们所需要的各种特性,并且还支持代码折叠。唯一一点不足的是只支持标准XML关键字 的语法高亮,而不能检测出DocBook特有的关键字。
主页:notepad-plus.sourceforge.net
2.3.1.5. 我的选择
我想对于熟悉Vim或Emacs编辑器的人来说,继续使用他们熟悉的编辑器就是最好的选择。 因此,我选择使用Vim+UTF-8编码+LF换行符。
2.3.2. DocBook DTD文件
这个东西没什么可以选择的,只是要注意版本的问题。现在最新的正式版本是4.4版,
在网站上还可以看到还有5.x版本的下载,但现在那还是开发版本,定义的标签可能会不稳定, 因此不建议使用。
主页:www.oasis-open.org
2.3.3. DocBook XSL文件
这个东西也没有什么好选择的,可以直接去主页下载,目前的最新版本是1.70。
主页:docbook.sourceforge.net
2.3.4. XSLT处理器
XSLT处理器有很多,既有开源的,也有商业的,但这里我们只重点介绍开源的版本。
开源的XSLT处理器主要有三种:xsltproc、Xalan、Saxon,它们都是成熟可靠和值得信赖的。
2.3.4.1. xsltproc
xsltproc来自著名的GNOME家族,是使用C语言编写的。
xsltproc是目前世界上最快的XSLT处理器,并且严格符合标准。
主页:xmlsoft.org
2.3.4.2. Saxon
Saxon(撒克逊人)是一个用Java语言写的开源XSLT处理器,具有很好的跨平台性。 它的作者Michael Kay同时也是XSLT
Reference一书的作者。
需要注意的是,Saxon目前有两个流派:Saxon 6符合XSLT 1.0规范;Saxon 8符合XSLT 2.0规范。 由于我们的DocBook
XSL使用的是1.0规范。因此我们应该选择Saxon 6,目前的最新版本是6.5.3。
主页:saxon.sourceforge.net
2.3.4.3. Xalan
Xalan系出名门,来自著名的Apache基金会,质量自然毋庸置疑。Xalan的一个与众不同之处在于,
它有分别用Java和C++两种语言的实现,Java版本更容易移植,而C++版本速度更快(如果我们下载预编译版本, 也不会有移植性问题)。
主页:xml.apache.org
2.3.4.4. 我的选择
上面三种XSLT处理器都可以满足我们的需要,并且我也都在使用。但是经过我的使用和测试,
用C语言实现的xsltproc确实很快,其速度要比用Java写的处理器快上将近一倍。
我觉得无论选择那个处理器,配置都只是一次的事,因此配置方便与否并不特别重用,而在实际使用中,
速度才是我们更关心的事情。更何况xsltproc是许多Linux发行版本自带的,根本不需要安装和配置。
因此,我选择使用xsltproc。但在Windows??系统上,我有时也用Saxon、Xalan和微软的 MSXML。
2.3.5. XML校验工具
开源的XML校验工具似乎不是很多,主要就是xmllint。 我想原因可能是许多开源的XML处理库都提供了校验功能,
集成校验功能或者实现一个独立的校验工具都很容易,再加上xmllint已经足够的好用了。 因此也就没人去开发别的专用校验工具了。
xmllint也是来自GNOME家族,和xsltproc是一家,也是一个用C语言实现的工具, 校验的速度很快。并且除了校验,还有好多其他的功能。
另外,Xalan软件中的一个例子xalansamples.jar中,也含有一个Java写的校验工具, 但我没有用过,不知道怎么样。
2.3.6. XSL-FO处理器
与众多的XSLT处理器相比,XSL-FO处理器无论在数量上还是在完成度上上都要差很多。 这主要是因为XSL-FO标准庞大而复杂,并且要实现一个排版引擎相当困难。
所以现有的开源XSL-FO处理器几乎都还在开发阶段,并且都没能实现完整的XSL-FO标准。
这个消息对中文用户尤为糟糕,因为这些西方开发的工具往往是在比较成熟了之后, 开发者才会开始处理东亚语言支持这类的问题。
现在我们能够得到的开源XSL-FO处理器主要有:FOP、PassiveTeX、xmlroff三种。
2.3.6.1. FOP
FOP与Xalan是同门师兄弟,也是来自Apache基金会,用Java编写。
FOP的特点是它的排版结果不仅仅可以输出PostScript??或PDF??,
还可以输出为PCL、SVG、Print、MIF、TXT等多种格式,甚至可以使用AWT直接输出到屏幕上。
FOP需要注意的是,目前网站上同时提供了两个版本的FOP:一个是0.2版,一个是0.9版。 其中前者遵循XSL-FO 1.0规范,后者遵循XSL-FO
1.1规范,二者并不兼容。 我们的XSLT处理器输出的是1.0版的XSL-FO格式,因此我们需要使用0.2版。 目前的最新版本是0.20.5。
主页:xml.apache.org
2.3.6.2. PassiveTeX
PassiveTeX是基于TeX开发的,我没有实际使用过。但由于TeX本身在处理中文时就需要特殊的宏包, 不知能不能和PassiveTeX很好的配合。
主页: http://www.tei-c.org.uk/Software/passivetex/
2.3.6.3. xmlroff
[todo]
2.3.6.4. 我的选择
上面的几个工具在处理中文时都会或多或少的遇到些问题,需要我们手工进行调整。
比较之后,最后我选择了FOP作为我的XSL-FO处理器,原因是网上比较容易找到用FOP处理中文的相关资料。
并且经过实际测试,大部分中文处理相关的问题都已经得到了解决。
2.3.7. DocBook自动构建工具
在Windows??系统上,由于系统固有的一些问题,使用自动构建工具有一些困难, 似乎只能用批处理文件做一些简单的自动化处理。就不再讨论了。
在Unix系统上,可以使用的有下面几种方案。
2.3.7.1. Makefile
使用Makefile是一个很好的方案,Makefile文件可以自己写也可以用现成的。 我发现DTD
XSL的安装包里就有一个很好的Makefile,名字叫Makefile.docbook。
这个Makefile文件支持许多种不同的工具链组件,并且很容易进行配置,是个很好的选择。
2.3.7.2. xmlto
xmlto是一个用bash写成的规模较大的脚本,它有一个很简单的命令行接口, 但是可以调用很多不同的工具进行各种转换。它也是一个很不错的选择。
2.3.7.3. 我的选择
相对而言,使用xmlto会较为方便,但我更喜欢使用Makefile,因为这样更容易定制, 尤其是在DTD
XSL的安装包里带的那个Makefile写的相当好,不仅切换工具很方便, 而且设置XSL的参数也相当容易,因此更适合我不停的试验各种不同的工具和参数组合。
2.3.8. 总结
经过上面的分析和我一段时间实际的试验和比较,我选择的各个工具链组件如下:
表 2.2. 我选择的DocBook工具链
      工具我的选择
      文本编辑器Vim
      DocBook XML DTD 定义文件4.4版
      DocBook XSL 样式表文件1.70版
      XML校验工具xmllint
      XSLT处理器xsltproc
      XSL-FO处理器FOP
      DocBook自动构建工具Makefile



这套工具组合经过我的测试,可以比较好的处理中文DocBook文档。
当然,随着系统的不同,个别的工具也要根据实际情况进行调整。
第 3 章 在Linux系统上建立DocBook开发环境
目录
  3.1. 文本编辑器
  3.2. DocBook DTD 文件
  3.3. DocBook XSL 文件
  3.4. XML catalog 文件
  3.5. XSLT处理器
  3.6. 第一次测试
  3.7. XSL-FO处理器
  3.8. 编写Makefile
  3.9. 第二次测试
本章主要讲述如何在Linux系统上搭建一套完整的DocBook开发环境。
我使用的Linux发行版为RHEL4(RedHat Enterprise Linux 4),如果使用其他的RedHat系的发行版,如Fedora和CentOS,
系统的配置应该和我这里几乎完全一致,如果是用的别的系列的发行版,如Suse、Debian, 我想应该也不会有太大的差别。
下面将按照安装的步骤进行各个组件的安装。
3.1. 文本编辑器
我使用Vim,RHEL4已经自带了,无需安装。如果想使用带图形界面的gvim,可以使用FC3的rpm包。
3.2. DocBook DTD 文件
RHEL4本身就带有4.1.2、4.2、4.3版的DTD,如果准备使用这些版本的话,那么什么也不需要安装。
它们的位置在/usr/share/sgml/docbook。
如果想使用4.4版的DTD的话,按下面的步骤安装:
  进入目录/usr/share/sgml/docbook, 创建子目录xml-dtd-4.4-1.0-25
  将下载的4.4版DTD释放至该目录
  编辑文件/usr/share/sgml/docbook/xmlcatalog
  这个文件就是XML catalog文件的一部分,负责将网络路径映射为主机路径, 在里面可以看到这样一段
<public publicId="-//OASIS//ELEMENTS DocBook XML Information Pool V4.3//EN"
  uri="xml-dtd-4.3-1.0-25/dbpoolx.mod"/>
<public publicId="-//OASIS//DTD DocBook XML V4.3//EN"
  uri="xml-dtd-4.3-1.0-25/docbookx.dtd"/>
<public publicId="-//OASIS//ENTITIES DocBook XML Character Entities V4.3//EN"
  uri="xml-dtd-4.3-1.0-25/dbcentx.mod"/>
<public publicId="-//OASIS//ENTITIES DocBook XML Notations V4.3//EN"
  uri="xml-dtd-4.3-1.0-25/dbnotnx.mod"/>
<public publicId="-//OASIS//ENTITIES DocBook XML Additional General Entities V4.3//EN"
  uri="xml-dtd-4.3-1.0-25/dbgenent.mod"/>
<public publicId="-//OASIS//ELEMENTS DocBook XML Document Hierarchy V4.3//EN"
  uri="xml-dtd-4.3-1.0-25/dbhierx.mod"/>
<public publicId="-//OASIS//DTD DocBook XML CALS Table Model V4.3//EN"
  uri="xml-dtd-4.3-1.0-25/calstblx.dtd"/>
<rewriteSystem systemIdStartString="http://www.oasis-open.org/docbook/xml/4.3"
  rewritePrefix="xml-dtd-4.3-1.0-25"/>
<rewriteURI uriStartString="http://www.oasis-open.org/docbook/xml/4.3"
  rewritePrefix="xml-dtd-4.3-1.0-25"/>
    这一段是用来映射4.3版的,我们照葫芦画瓢,复制下来,把4.3改成4.4就行了。
  在前面还有一段
<public publicId="ISO 8879:1986//ENTITIES Publishing//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-pub.ent"/>
<public publicId="ISO 8879:1986//ENTITIES Greek Letters//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-grk1.ent"/>
<public publicId="ISO 8879:1986//ENTITIES Box and Line Drawing//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-box.ent"/>
<public publicId="ISO 8879:1986//ENTITIES Greek Symbols//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-grk3.ent"/>
<public publicId="ISO 8879:1986//ENTITIES Added Math Symbols: Negated Relations//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-amsn.ent"/>
<public publicId="ISO 8879:1986//ENTITIES Numeric and Special Graphic//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-num.ent"/>
<public publicId="ISO 8879:1986//ENTITIES Alternative Greek Symbols//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-grk4.ent"/>
<public publicId="ISO 8879:1986//ENTITIES Diacritical Marks//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-dia.ent"/>
<public publicId="ISO 8879:1986//ENTITIES Monotoniko Greek//EN"
  uri="xml-dtd-4.3-1.0-25/ent/iso-grk2.ent"/>
      这一段映射了一些ISO定义的entity的路径,改不该都行,如果想统一成4.4版的, 就把这一段的4.3全改为4.4就行了
3.3. DocBook XSL 文件
RHEL4自带了1.65版的XSL文件,如果准备使用这一版本的话,就什么都不需要做了。
它的位置在/usr/share/sgml/docbook/xsl-stylesheets-1.65.1-2。
如果想使用1.70版的XSL的话,按下面的步骤安装:
  进入目录/usr/share/sgml/docbook, 创建子目录xsl-sytlesheets-1.70.1
  创建一个符号连接,指向刚才创建的目录
  ln -s xsl-sytlesheets-1.70.1 xsl-stylesheets
  进行这一步的原因是我觉得系统默认的catalog文件是把路径写死的, 不是很方便,而加一个符号连接,升级的时候只要改一下符号连接的指向就行了。
  修改catalog文件
  这一步先放着,下面再说。
3.4. XML catalog 文件
在RHEL4中,catalog文件的位置默认是在/etc/xml/catalog。
这也是xsltproc默认的位置,因此最好就用这个文件。如果一定要用其它文件的话, 可以在XML_CATALOG_FILES环境变量里指明位置。
在catalog文件中,可以看到这样几行
<delegatePublic publicIdStartString="-//OASIS//ENTITIES DocBook XML"
  catalog="file:///usr/share/sgml/docbook/xmlcatalog"/>
<delegatePublic publicIdStartString="-//OASIS//DTD DocBook XML"
  catalog="file:///usr/share/sgml/docbook/xmlcatalog"/>
<delegatePublic publicIdStartString="ISO 8879:1986"
  catalog="file:///usr/share/sgml/docbook/xmlcatalog"/>
<delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/"
  catalog="file:///usr/share/sgml/docbook/xmlcatalog"/>
<delegateURI uriStartString="http://www.oasis-open.org/docbook/"
  catalog="file:///usr/share/sgml/docbook/xmlcatalog"/>
      这几行就把我们前面编辑过的那个xmlcatalog文件引入了进来。
还有这样几行
<rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/1.65.1"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets-1.65.1-2"/>
<rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/1.65.1"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets-1.65.1-2"/>
<rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/current"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets-1.65.1-2"/>
<rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/current"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets-1.65.1-2"/>
      这几行是关于XSL文件的映射,把它们改成下面这个样子就行了。
<rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/1.65.1"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets-1.65.1-2"/>
<rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/1.65.1"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets-1.65.1-2"/>
<rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/1.70.1"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets-1.70.1"/>
<rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/1.70.1"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets-1.70.1"/>
<rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/current"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets"/>
<rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/current"
  rewritePrefix="file:///usr/share/sgml/docbook/xsl-stylesheets"/>
      3.5. XSLT处理器
RHEL4上,xsltproc是系统自带的,不需要安装和配置,直接就能用。
3.6. 第一次测试
到了这里,最基本的DocBook开发环境就已经搭好了,可以将DocBook转成html了。 这里我们先做一下测试,以确保前面的操作没有问题。
找一个简单的DocBook源文件,例如下面这个:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
<book>
  <bookinfo>
    <title>DocBook Test</title>
    <author>
      <firstname>zhc</firstname>
    </author>
  </bookinfo>

  <chapter>
    <title>chapter 1</title>
    <sect1>this is a section...</sect1>
  </chapter>

  <chapter>
    <title>chapter 2</title>
    <para>this is a chapter...</para>
  </chapter>
</book>
      执行转换操作:
xsltproc http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl
test.xml
如果成功的生成了一个html文件,就说明前面的操作成功了。
3.7. XSL-FO处理器
在RHEL4上,默认没有安装FOP,我们必须手工安装和配置。FOP本身的安装和配置其实很容易,
但要想让它很好的处理中文,则还需要一些额外的配置。下面是所有的安装和配置步骤
  确认系统上安装了Java??1.4或以上版本的运行环境,并且可以正常使用。
[zhc@zhangchi docbook]$ java -version
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
      下载并安装FOP,我使用的是0.20.5,安装在了 /opt/apache/fop-0.20.5目录下,
  并建立了一个符号连接/opt/apache/fop指向它
  进入FOP的安装目录,可以看到一个叫fop.sh的文件, 这就是我们调用FOP的脚本,为了使用方便,我又建立了一个叫fop 的符号连接指向它。
  安装中文字体
  FOP同时支持Type I和True Type格式的字体,但首先必须把想使用的字体向FOP系统注册。
  首先,我们得得到合适的中文字体,最简单的方法是从一个Windows??系统的Fonts目录拷贝。
  我使用了simsun.ttc(宋体)、simhei.ttf(黑体)、simkai.ttf(楷体)等几种字体。
  首先把需要的字体文件复制到/usr/X11R6/lib/X11/fonts/TTF目录下, 然后在该目录下,对于ttf文件执行:
java -cp $FOP_HOME/build/fop.jar;$FOP_HOME/lib/avalon-framework.jar;
    $FOP_HOME/lib/xml-apis.jar;
    $FOP_HOME/lib/xercesImpl.jar;$FOP_HOME/lib/xalan.jar
    org.apache.fop.fonts.apps.TTFReader simhei.ttf simhei.xml
      对于ttf文件执行:
java -cp $FOP_HOME/build/fop.jar;$FOP_HOME/lib/avalon-framework.jar;
    $FOP_HOME/lib/xml-apis.jar;
    $FOP_HOME/lib/xercesImpl.jar;$FOP_HOME/lib/xalan.jar
    org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun"
    simsun.ttc simsun.xml
      这样,就得到了每种字体的Metrics文件。
  然后,进入FOP的安装目录,编辑conf/userconfig.xml文件。 在最后的font一节中加入如下内容:
<fonts>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/TTF/simsun.xml"
    embed-file="/usr/X11R6/lib/X11/fonts/TTF/simsun.ttc"
    kerning="yes">
    <font-triplet name="simsun" style="normal" weight="normal"/>
    <font-triplet name="simsun" style="normal" weight="bold"/>
    <font-triplet name="simsun" style="italic" weight="normal"/>
    <font-triplet name="simsun" style="italic" weight="bold"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/TTF/simhei.xml"
    embed-file="/usr/X11R6/lib/X11/fonts/TTF/simhei.ttf"
    kerning="yes">
    <font-triplet name="simhei" style="normal" weight="normal"/>
    <font-triplet name="simhei" style="normal" weight="bold"/>
    <font-triplet name="simhei" style="italic" weight="normal"/>
    <font-triplet name="simhei" style="italic" weight="bold"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/TTF/simfang.xml"
    embed-file="/usr/X11R6/lib/X11/fonts/TTF/simfang.ttf"
    kerning="yes">
    <font-triplet name="simfang" style="normal" weight="normal"/>
    <font-triplet name="simfang" style="normal" weight="bold"/>
    <font-triplet name="simfang" style="italic" weight="normal"/>
    <font-triplet name="simfang" style="italic" weight="bold"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/TTF/simli.xml"
    embed-file="/usr/X11R6/lib/X11/fonts/TTF/simli.ttf"
    kerning="yes">
    <font-triplet name="simli" style="normal" weight="normal"/>
    <font-triplet name="simli" style="normal" weight="bold"/>
    <font-triplet name="simli" style="italic" weight="normal"/>
    <font-triplet name="simli" style="italic" weight="bold"/>
  </font>
  <font metrics-file="/usr/X11R6/lib/X11/fonts/TTF/simyou.xml"
    embed-file="/usr/X11R6/lib/X11/fonts/TTF/simyou.ttf"
    kerning="yes">
    <font-triplet name="simyou" style="normal" weight="normal"/>
    <font-triplet name="simyou" style="normal" weight="bold"/>
    <font-triplet name="simyou" style="italic" weight="normal"/>
    <font-triplet name="simyou" style="italic" weight="bold"/>
  </font>
</fonts>
      这样,就完成了中文字体的添加。
  最后,还有一点要说明的是,把Windows??系统下的字体拷贝过来并使用其实是不合法的,
  因为即使你用的是正版的Windows??,也只有使用这些字体的权利,而没有再分发它们的权利。
  不过如果是在Windows??系统上,把字体的一部分嵌入文档,似乎是又合法的, 因为Adobe??的Acrobat软件在生成pdf文件时就是这么干的。
  如果是这样的话,我们直接把字体从Windows??系统拷贝至Linux系统,是非法的;
  但是如果不拷贝,利用Samba去访问一个由Windows??系统共享出的目录中的字体呢?
  呵呵,法律问题总是很奇怪的。不管怎么说,如果是要生成商业文档的话,最好还是小心为妙。
  安装图像支持库
  FOP原生支持bmp、eps、gif、jpeg和tiff(部分)这四种图像格式,但对于目前使用越来来越广泛的png格式,
  和未来的矢量图行标准svg格式却不支持,因此还需要安装第三方的图像处理库。
  FOP目前支持JAI、 JIMI和 Batik三种图像处理库, 前两者提供了png支持,后者提供了svg支持。
  JAI和JIMI的主要区别在于,JAI不是纯Java写的,因此处理速度较快,但不是所有平台都可用;
  JIMI是纯Java写的,但速度较慢。对于RHEL4,由于JAI提供了官方支持,因此首选JAI。
  JAI安装时,只需把压缩包里的jai_core.jar和jai_codec.jar 文件拷入$FOP_HOME/lib目录即可。FOP会自动调用。
  JIMI安装也很简单,把压缩包中的JimiProClasses.zip拷贝至$FOP_HOME/lib 并改名为jimi-1.0.jar即可。
  由于0.20.5版的FOP包里自带了一个Batik,所以就不用单独安它了。
至此,FOP已经安装完毕,并且可以处理中文了。但是不要急,我们在配好了自动编译工具后,再来做中文测试。
3.8. 编写Makefile
前面已经说过,我们将使用Makefile文件进行自动化的转换控制。
我们以DocBook XSL安装包中的tools/make/Makefile.docbook为模版进行修改。
首先,拷贝出来一份,放到我们的测试目录下。然后开始编辑。
      注意
      如果使用系统自带的xsl文件,可能会找不到这个Makefile文件,没有关系,
      可以去下载一个XSL安装包,但只使用里面的Makefile.docbook

因为Makefile.docbook很长,下面仅仅列出了需要修改的地方。
DOCBOOK_OUTPUT_FORMATS ?= html pdf
      这里写上需要生成的格式。
FOP_HOME ?= /opt/apache/fop
FOP = $(FOP_HOME)/fop.sh
FOP_FLAGS = -c $(FOP_HOME)/conf/userconfig.xml
      因为没把fop加到PATH中,这里要写明全路径, 并加上-c选项,这样才能把我们配置的字体信息告诉FOP。
# for single-file HTML outpout
HTML_CUSTOM := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" /
  version="1.0"> /
  <xsl:import href="$(DOCBOOK_XSL)/html/docbook.xsl"/> /
  <xsl:param name="refentry.generate.name">1</xsl:param> /
  <xsl:param name="refentry.generate.title">0</xsl:param> /
  <xsl:param name="root.filename"></xsl:param> /
  <xsl:param name="variablelist.as.table">0</xsl:param> /
  <xsl:param name="html.stylesheet">$(HTML_STYLESHEET)</xsl:param> /
  <xsl:param name="admon.graphics">0</xsl:param> /
  <xsl:param name="index.on.type">1</xsl:param> /
  <xsl:param name="l10n.gentext.default.language">zh_cn</xsl:param> /
  <xsl:param name="table.borders.with.css" select="1"/> /
  <xsl:param name="section.autolabel" select="1"/> /
  <xsl:param name="section.label.includes.component.label" select="1"/> /
  <xsl:param name="generate.meta.abstract" select="1"/> /
</xsl:stylesheet>
      这是生成HTML时的配置信息,关键要改的几项为:
  默认语言改成zh_cn
  设置表格边框使用css样式表
# for chunked HTML output
CHNK_CUSTOM := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" /
  version="1.0"> /
  <xsl:import href="$(DOCBOOK_XSL)/html/chunk.xsl"/> /
  <xsl:param name="refentry.generate.name">0</xsl:param> /
  <xsl:param name="refentry.generate.title">1</xsl:param> /
  <xsl:param name="variablelist.as.table">0</xsl:param> /
  <xsl:param name="html.stylesheet">$(HTML_STYLESHEET)</xsl:param> /
  <xsl:param name="admon.graphics">1</xsl:param> /
  <xsl:param name="admon.graphics.path">$(HTML_IMAGES)</xsl:param> /
  <xsl:param name="admon.graphics.extension">$(HTML_IMAGES_EXT)</xsl:param> /
  <xsl:param name="root.filename"></xsl:param> /
  <xsl:param name="generate.manifest">1</xsl:param> /
  <xsl:param name="use.id.as.filename">1</xsl:param> /
  <xsl:param name="chunker.output.indent">yes</xsl:param> /
  <xsl:param name="index.on.type">1</xsl:param> /
  <xsl:param name="l10n.gentext.default.language">zh_cn</xsl:param> /
  <xsl:param name="table.borders.with.css">1</xsl:param> /
  <xsl:param name="section.autolabel">1</xsl:param> /
  <xsl:param name="section.label.includes.component.label">1</xsl:param> /
  <xsl:param name="generate.meta.abstract" select="1"/> /
</xsl:stylesheet>
      这是生成多页HTML时的配置信息,要修改的地方与上面基本相同。
# for FO output
FO_CUSTOM := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" /
  xmlns:fo="http://www.w3.org/1999/XSL/Format" /
  version="1.0"> /
  <xsl:import href="$(DOCBOOK_XSL)/fo/docbook.xsl"/> /
  <xsl:param name="$(PDF_MAKER).extensions">1</xsl:param> /
  <xsl:param name="paper.type">A4</xsl:param> /
  <xsl:param name="draft.watermark.image"></xsl:param> /
  <xsl:param name="hyphenation">false</xsl:param> /
  <xsl:param name="alignment">left</xsl:param> /
  <xsl:param name="refentry.generate.name">1</xsl:param> /
  <xsl:param name="refentry.generate.title">0</xsl:param> /
  <xsl:param name="refentry.pagebreak">1</xsl:param> /
  <xsl:param name="shade.verbatim">1</xsl:param> /
  <xsl:param name="variablelist.as.blocks">1</xsl:param> /
  <xsl:param name="ulink.show">1</xsl:param> /
  <xsl:param name="ulink.footnotes">1</xsl:param> /
  <xsl:param name="index.on.type">1</xsl:param> /
  <xsl:attribute-set name="xref.properties"> /
    <xsl:attribute name="color">blue</xsl:attribute> /
  </xsl:attribute-set> /
  <xsl:attribute-set name="shade.verbatim.style"> /
    <xsl:attribute name="background-color">/#E0E0E0</xsl:attribute> /
    <xsl:attribute name="padding-left">4pt</xsl:attribute> /
    <xsl:attribute name="padding-right">4pt</xsl:attribute> /
    <xsl:attribute name="padding-top">4pt</xsl:attribute> /
    <xsl:attribute name="padding-bottom">4pt</xsl:attribute> /
  </xsl:attribute-set> /
  <xsl:attribute-set name="section.title.level1.properties"> /
    <xsl:attribute name="font-size"> /
      <xsl:value-of select="$$body.font.master * 1.728"></xsl:value-of> /
      <xsl:text>pt</xsl:text> /
    </xsl:attribute> /
  </xsl:attribute-set> /
  <xsl:attribute-set name="section.title.level2.properties"> /
    <xsl:attribute name="font-size"> /
      <xsl:value-of select="$$body.font.master * 1.44"></xsl:value-of> /
      <xsl:text>pt</xsl:text> /
    </xsl:attribute> /
  </xsl:attribute-set> /
  <xsl:attribute-set name="section.title.level3.properties"> /
    <xsl:attribute name="font-size"> /
      <xsl:value-of select="$$body.font.master * 1.2"></xsl:value-of> /
      <xsl:text>pt</xsl:text> /
    </xsl:attribute> /
  </xsl:attribute-set> /
  <xsl:attribute-set name="section.title.level4.properties"> /
    <xsl:attribute name="font-size"> /
      <xsl:value-of select="$$body.font.master"></xsl:value-of> /
      <xsl:text>pt</xsl:text> /
    </xsl:attribute> /
  </xsl:attribute-set> /
  <xsl:attribute-set name="component.title.properties"> /
    <xsl:attribute name="font-size"> /
      <xsl:value-of select="$$body.font.master * 1.728"></xsl:value-of> /
      <xsl:text>pt</xsl:text> /
    </xsl:attribute> /
  </xsl:attribute-set> /
  <xsl:attribute-set name="monospace.verbatim.properties"> /
    <xsl:attribute name="font-size"> /
      <xsl:value-of select="$$body.font.master * 0.8"></xsl:value-of> /
      <xsl:text>pt</xsl:text> /
    </xsl:attribute> /
  </xsl:attribute-set> /
  <xsl:param name="l10n.gentext.default.language">zh_cn</xsl:param> /
  <xsl:param name="body.font.family">simsun,serif</xsl:param> /
  <xsl:param name="title.font.family">simhei,sans-serif</xsl:param> /
  <xsl:param name="monospace.font.family">simsun,monospace</xsl:param> /
  <xsl:param name="saxon.character.representation" select="'native'"/> /
  <xsl:param name="admon.graphics" select="1"/> /
  <xsl:param name="section.autolabel" select="1"/> /
  <xsl:param name="section.label.includes.component.label" select="1"/> /
  <xsl:param name="table.borders.with.css" select="1"/> /
  <xsl:param name="use.extensions" select="1"/> /
  <xsl:param name="tablecolumns.extension" select="0"/> /
  <xsl:param name="callout.unicode" select="1"/> /
  <xsl:param name="callout.unicode.start.character" select="10102"></xsl:param> /
  <xsl:param name="variablelist.as.blocks" select="1"></xsl:param> /
  <xsl:param name="callout.graphics" select="0"/> /
  <xsl:param name="hyphenate">false</xsl:param> /
  <xsl:param name="paper.type" select="'A4'"/> /
  <xsl:param name="draft.mode" select="'no'"/> /
  <xsl:param name="generate.toc"> /
    appendix toc /
    article/appendix nop /
    article toc,title /
    book toc,title /
    chapter nop /
    part toc,title /
    preface toc,title /
    qandadiv toc /
    qandaset toc /
    reference toc,title /
    sect1 nop /
    sect2 nop /
    sect3 nop /
    sect4 nop /
    sect5 nop /
    section nop /
    set toc,title /
  </xsl:param> /
</xsl:stylesheet>
      这是生成fo时的配置信息,关键要改的几项为:
  默认语言改成zh_cn
  设置各个对象默认使用的字体,一定要把中文加进去
  设置使用XSL-FO处理器扩展
ifeq ($(PDF_MAKER),fop)
mkdir -p $(DOCBOOK_TMP)
sed -e "s/language=/"zh_[a-z]/{2/}/"/language=/"zh/"/g" $< > $(DOCBOOK_TMP)/tmpfo.fo
$(FOP) $(FOP_FLAGS) $(DOCBOOK_TMP)/tmpfo.fo $@
$(RM) -r $(DOCBOOK_TMP)
else
      这是使用FOP时的生成规则,主要改动是对中间生成的fo文件做了一下处理。
这是因为,DocBook对于中文用zh_cn和zh_tw来表示,而XSL-FO处理器则只认识zh,
对于这个问题,网上一般的解决办法是把XSL包中zh_cn的本地化文件拷出一份叫zh,
但我觉得这样做会影响移植性,因此是用对fo文件做处理把zh_cn换成zh的方法, 这样虽然速度慢点,但到哪里都可以工作。
all :
    $(MAKE) clean
    $(MAKE) docbook
      原来的Makefile没有all规则,这里加了一个。
3.9. 第二次测试
到了这里,中文DocBook开发环境就已经完全搭好了。 可以找几个包含中文的源文件进行测试了。
[zhc@radar docbook]$ make html
Parsing stylesheet - took 0 ms
Parsing document docbook.xml took 111 ms
XInclude processing docbook.xml took 0 ms
Applying stylesheet took 3215 ms
Saving result took 264 ms
[zhc@radar docbook]$
      生成单页html
[zhc@radar docbook]$ make chunk
Parsing stylesheet - took 0 ms
Parsing document docbook.xml took 109 ms
XInclude processing docbook.xml took 0 ms
Writing docbook/preface.html for preface(preface)
Writing docbook/sec_brief_mentioned.html for sect1(sec_brief_mentioned)
Writing docbook/sec_brief_unmentioned.html for sect1(sec_brief_unmentioned)
Writing docbook/sec_brief_organize.html for sect1(sec_brief_organize)
Writing docbook/cpt_brief.html for chapter(cpt_brief)
Writing docbook/sec_toolchain_purpose.html for sect1(sec_toolchain_purpose)
Writing docbook/sec_toolchain_selection.html for sect1(sec_toolchain_selection)
Writing docbook/cpt_toolchain.html for chapter(cpt_toolchain)
Writing docbook/ch03s02.html for sect1
Writing docbook/ch03s03.html for sect1
Writing docbook/ch03s04.html for sect1
Writing docbook/ch03s05.html for sect1
Writing docbook/ch03s06.html for sect1
Writing docbook/ch03s07.html for sect1
Writing docbook/ch03s08.html for sect1
Writing docbook/cpt_linux.html for chapter(cpt_linux)
Writing docbook/cpt_windows.html for chapter(cpt_windows)
Writing docbook/bk01.html for book
Writing docbook.manifest_html
Applying stylesheet took 4722 ms
Saving result took 0 ms
[zhc@radar docbook]$
      生成多页html
[zhc@radar docbook]$ make pdf
Parsing stylesheet - took 0 ms
Parsing document docbook.xml took 109 ms
XInclude processing docbook.xml took 0 ms
Making portrait pages on A4 paper (210mmx297mm)
Applying stylesheet took 2745 ms
Saving result took 187 ms
mkdir -p /tmp/docbook-make-22058
sed -e "s/language=/"zh_[a-z]/{2/}/"/language=/"zh/"/g" docbook.fo > /
    /tmp/docbook-make-22058/tmpfo.fo
/opt/apache/fop/fop.sh -c /opt/apache/fop/conf/userconfig.xml  /
    /tmp/docbook-make-22058/tmpfo.fo docbook.pdf
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] FOP 0.20.5
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] building formatting object tree
[INFO] setting up fonts
[INFO] [1]
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] [2]
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] [3]
[INFO] [4]
[INFO] [5]
[INFO] [6]
[INFO] [7]
[INFO] [8]
[INFO] [9]
[INFO] [10]
[INFO] [11]
[INFO] [12]
[INFO] [13]
[INFO] [14]
[INFO] [15]
[INFO] [16]
[INFO] [17]
[INFO] [18]
[INFO] [19]
[INFO] [20]
[INFO] [21]
[INFO] [22]
[INFO] [23]
[INFO] [24]
[INFO] [25]
[INFO] Parsing of document complete, stopping renderer
rm -f -r /tmp/docbook-make-22058
rm docbook.fo
[zhc@radar docbook]$
      生成pdf
如果上面的过程一切正常,输出的文件显示正确,那么DocBook环境就算是搭建成功了。
第 4 章 在Windows??系统上建立DocBook开发环境
目录
  4.1. 规划目录结构
  4.2. DocBook DTD 文件
  4.3. DocBook XSL 文件
  4.4. XML catalog 文件
  4.5. XSLT处理器
  4.6. XSL-FO处理器
本章主要讲述如何在Windows??系统上搭建DocBook的开发环境, 由于许多软件的安装和配置过程与在Linux系统上是相同的,因此,
本章将着重讲述在Windows??系统上特殊的的地方,其它内容, 请参考第 3 章 在Linux系统上建立DocBook开发环境。
4.1. 规划目录结构
在Windows??系统上,由于系统不像Unix提供了一套约定俗成的目录树结构, 各个应用程序往往喜欢以安装目录为根,去规划自己的可执行文件、库文件、
数据文件、配置文件等的位置。因此我们在建立DocBook的开发环境时, 也得自己规划一套我们的目录结构。
首先是选择根目录,最好目录名比较短,不要含有空格和中文,以尽量避免麻烦。 我选择的根目录是D:/dev/dbk下面的讨论以此为准。
下面是我的目录结构:
D:/dev/dbk>tree
文件夹 PATH 列表
卷序列号码为 000007C0 1459:3BC8
D:.
├─dtd
│  └─4.4
├─xsl
│  └─1.70
├─bin
├─etc
└─fop
      4.2. DocBook DTD 文件
将压缩包解至%DOCBOOK_HOME%/dtd/4.4目录即可。
4.3. DocBook XSL 文件
将压缩包解至%DOCBOOK_HOME%/xsl/1.70目录即可。
4.4. XML catalog 文件
由于在Windows??系统上,我们没有可以参照的模版,因此只能重头写了,关于catalog文件的语法, 请参考DocBook XSL: The Complete
Guide这本书。
这里给出我的catalog文件:
<xml version="1.0" encoding="utf-8"?>
<!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">

  <!-- BASE DIR -->
  <group xml:base="file:///d:/dev/dbk/" >

    <!-- DTD URL -->
    <rewriteSystem
      systemIdStartString="http://www.oasis-open.org/docbook/xml/4.4/"
      rewritePrefix="dtd/4.4/" />
    <!-- XSL URL -->
    <rewriteURI
      uriStartString="http://docbook.sourceforge.net/release/xsl/current/"
      rewritePrefix="xsl/1.70/" />

    <!-- DTD PUBLIC ID -->
    <nextCatalog  catalog="dtd/4.4/catalog.xml" />

    <!-- SIMPLE DTD SYSTEM ID -->
    <system
      systemId="docbook.dtd"
      uri="dtd/4.4/docbookx.dtd" />

    <!-- SHORT XSL REF -->
    <uri
      name="docbook.xsl"
      uri="xsl/1.70/html/docbook.xsl" />
    <uri
      name="chunk.xsl"
      uri="xsl/1.70/html/chunk.xsl" />
    <uri
      name="fo-docbook.xsl"
      uri="xsl/1.70/fo/docbook.xsl" />

  </group>
</catalog>
    我把它放在了%DOCBOOK_HOME%/etc目录下。
4.5. XSLT处理器
在www.zlatkovic.com上可以找到 xsltproc的Windows??移植版。下载libxml2、libxslt和iconv这几个压缩包,打开后,
只需要把每个包内bin目录下的东西拷到%DOCBOOK_HOME%/bin目录就行了,
其他的东西不需要。可以发现,除了xsltproc,我们还得到了xmllint,一举两得。
由于在Windows??系统下,默认的catalog文件存放路径 file:///etc/xml/catalog不存在,
我们还必须得在环境变量XML_CATALOG_FILES中设定我们的catalog文件的路径。
set XML_CATALOG_FILES=d:/dev/dbk/etc/catalog
为了检测我们的catalog是不是能够被正常解析,还可以设定一个叫XML_DEBUG_CATALOG的环境变量,
设定之后,在运行xsltproc时,就会打印出映射网路路径至本地路径的详细过程。
4.6. XSL-FO处理器
由于FOP是一个java程序,因此在Windows??系统上的安装和配置与在Linux系统上几乎一样。 我把它安装在了%DOCBOOK_HOME%/fop目录下。
需要注意的一点是记得在环境变量PATH中加入此路径。
至于其它诸如字体、图像处理包等的安装配置,也与在Linux系统下相同。
第 5 章 其他工具链组件
目录
  5.1. Saxon
  5.2. Xalan
  5.3. XEP
在前面几章中,讲述的是在Windows??和Linux系统上如何安装和配置我在 第 2.3.8 节 “总结”中选择的DocBook工具链组件。
但实际上,在工具链的每一个环节,有还有许多可以替换的组件,这一章中, 就主要讲述这些组件的安装、配置和使用。
当然,仅仅限于我实际用过的组件。
5.1. Saxon
[todo]
5.2. Xalan
[todo]
5.3. XEP
[todo]

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值