Docbook Beginning

Docbook Beginning
 

Docbook Beginning

http://blog.csdn.net/mickeyrat/archive/2005/02/04/281050.aspx

编写技术文档,我想谁都遇到过。很多人都用MS Word,不可否认Word的功能确实非常强大,但是用Word有一些缺点无法避免:

1)
写文档的时候,不得不兼顾文档的格式,这是件很头痛的事情,至少对我来说。经常是最后不得不Review好几遍,就是为了统一格式,即使使用模板也不能避免这个问题。

2)
无法进行有效的版本控制,因为Word保存的是二进制格式,这就不能使用CVS的版本控制功能,只能手工合并,这样很容易出错。虽然Word现在也可以保存成XML,但是看一下保存的文件就会发现,格式和内容混杂在一起,简直没法看。况且,版本控制的时候,我们注重的往往是内容,现在却不得不处理大量的格式信息,至少我没兴趣把时间花在这个上面。

3)
可移植性问题,毕竟Word只能运行在Windows平台上,即使可以保存为XML或者HTML,在其他平台上你又如何编辑和打印呢?

4)
用盗版还是正版的问题,公司不得不考虑知识产权这个比较严肃的话题。

讲到这里,很多人可能会自然而然的想到XML+XSLT+开源代码。Docbook正是基于XSLT把内容和形式分开的思想开发的,它可以解决上述的所有问题。

那么到底什么是Docbook

Docbook
是一些标准和工具的集合。标准包括XMLDTDXSLXSL-FODocbook DTDDocbook的核心),工具则包括XSLT ProcessorXSL-FO Processor。这些标准和工具组成基于Docbook的发布系统。

Docbook
原本是为了编写和发布技术文档而开发的,O'Reily是发起者之一,但实际上它也可以用于其他类型的文档,因为它所定义的结构符合大部分现代书籍的格式。

Docbook的核心是Docbook DTD,这个标准是由OASISDocbook小组维护的。这个标准对文档的结构进行了详细的定义,譬如书(book元素)可以包含一个标题(title),若干的段落(para)和若干的章节(chapter),等等。这些都符合常规书籍的出版格式。

使用Docbook编写文档,实际上就是根据Docbook DTD编辑XML文件的过程。所有的内容都用标签封装起来,Docbook提供了十分详尽的定义,几乎任何内容都可以根据其用途找到对应的标签。在编辑文档的过程中,作者只需要关心内容,根本不会涉及到排版的问题。

要发布Docbook文档,必须使用XSLT。专为Docbook使用的XSLT不属于Docbook的核心,任何人都可以编写自己的XSLT。当然,你不用真的自己写(除非你有兴趣),已经有人做了这方面的工作,你可以在SourceForge找到Norman Walsh开发的Docbook样式单,写这篇文章的时候,最新版本是1.67.2

如果最终发布Docbook文档,自然需要用到XSLT ProcessorXSL-FO Processor这类的工具,可供选择开源工具很多,像xsltprocXalanFOPPassiveTeX等等。这些工具实际上也是与Docbook无关的。因此不用浪费时间在网上找Docbook的专门工具,只要找到按标准实现的工具,就可以用来发布Docbook文档。

总的来说,Docbook的发布流程是这样的:

1)
编写XML文档;

2)
使用XSLT ProcessorXML文档转换成HTML文档,或者XSL-FO文档;

3)
使用XSL-FO ProcessorXSL-FO文档转换为PDF或者PS文件。

因此,Docbook有下列优点:

1)
内容与格式分离;

2)
内容高度结构化;

3)
平台无关;

4)
发布过程可以自动化;

5)
易于版本控制;

6)
可以生成多种形式的文档。

Docbook的缺点就是非WYSIWYG,编辑的时候不如Word那么直观,直接编辑XML文件还是一件比较烦琐的事情。但是这个问题并不严重,使用专门的XML编辑器就可以让工作轻松很多,譬如Emacs就支持Docbook文档的编辑。至于效果,使用工具生成最终文档是非常快的。相对于它的优点而言,这点缺点又算的了什么呢。

参考资料:
Docbook

Docbook Publishing Model

安装配置Docbook工具

使用Docbook发布文档,需要安装以下的工具:
    *DocBook DTD
    *DocBook XSL
样式单
    *XSLT
处理程序
    *XSL-FO
处理程序

下面详细介绍各个工具的安装。

1.安装DocBook DTD

Docbook DTD可以到OASIS的网站上下载,在这里你可以找到zip格式的压缩包。目前的最新版本是4.2

事实上可以不下载Docbook DTD。如果你的文档DTD声明这样写:

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

根据这样的定义,大部分XML处理器能够从网络上获取DTD。这样做的好处是编辑的Docbook文档移植性好,可以在没有安装Docbook DTD的机器上使用。不过由于Docbook DTD比较庞大,通过网络获取DTD会影响处理速度,在低速网络或者网络比较糟糕的情况下,影响尤为显著。

如果选择使用本地DTD,文档的DTD引用应该这样写:

Linux:
<!DOCTYPE book SYSTEM "/usr/share/docbook-4.2/docbookx.dtd">

Windows:
<!DOCTYPE book SYSTEM "file:///C:/xml/docbook42/docbookx.dtd">

Docbook提供了一种方式,让用户可以使用相同的DTD声明,但可以在使用网络获取DTD和使用本地DTD之间切换,同时拥有两者的优势。这就是catalog文件的作用。典型的catalog的声明如下:

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <group id="DocbookDTD" prefer="public">
      <system 
         systemId="
http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
         uri="
file:///usr/share/xml/docbook42/docbookx.dtd"/>
  </group>
</catalog>

这个声明把网络DTD映射到本地DTD。如果使用支持CatalogXSLT Processor,它首先会查找本地文件,如果本地文件不存在,再查找网络。

2.安装Docbook XSL样式单

http://docbook.sourceforge.net上可以下载到Docbook XSL样式单,目前最新的版本是1.67.2

解压之后,有几个比较主要的目录:
 *common   -
包含的是公用的模块,诸如语言之类的文件都在这里。
 *extensions -
针对特定的XSLT Processor编写的扩展代码。
 *fo             -
生成XSL-FO文件所需的XSL样式单。
 *html          -
生成HTML文件所需的XSL样式单。
 *images      -
生成文档时所需要的图片。
 *doc          -
有关XSL样式单的文档,同样是Docbook文档。

其他还有像htmlhelp之类的目录,但不是生成HTMLXSL-FO所必须的。

3.安装XSLT Processor

目前有许多免费的XSLT Processor,最常用的是
 *Saxon    -
使用Java实现,http://saxon.sourceforge.net/
 *Xalan     -
JavaC++版本,http://xml.apache.org/xalan-j/index.html
 *xsltproc -
使用C实现,是最快的处理程序,http://xmlsoft.org/XSLT/
 
因为SaxonXalan都有Java版本,所以按照一般的Java程序的安装方式安装即可。下面介绍xsltproc的安装,因为它速度快,是我比较喜欢的处理程序。

如果你使用windows平台,那么你有两个方法可选:

 1) 直接下载windows平台预编译的版本。你需要下载libxml, libxslt, iconv,它们都是zip格式,解压之后,在环境变量PATH中添加xsltproc.exe.dll文件的路径。
 
 
如果你不想编辑环境变量,一个简单的办法是把下面这些文件复制到C:"Windows"System32

  libxslt.dll
  libxml2.dll
  libexslt.dll
  iconv.dll
  xsltproc.exe

 这样在命令行就可以直接找到这些文件了。完成之后,运行

 xsltproc -version

 
打印出版本号则表明完成安装。
 
 2)
Cygwin下安装,这是我选择使用的方式。Cygwin是一个在Windows下模拟Linux Shell的应用程序。如果你喜欢以Linux命令的方式来使用xsltproc下载Cygwin安装程序。Cygwin的是通过网络安装的,首先你从它提供的包列表中选择libxslt,然后安装程序会根据依赖关系自动选择libxml2,确定之后,安装程序下载并安装xsltproc。完成安装之后,你就可以运行

 xsltproc -version

来检查是否安装成功。
 
3)
如果使用Linux,很有可能系统已经安装了xsltproc。运行

xsltproc -version

检查一下是否已经安装。如果运行命令失败,或者版本太老,那么访问下面两个URL获取最新的RPM包:

http://rpmfind.net/linux/rpm2html/search.php?query=libxml2
http://rpmfind.net/linux/rpm2html/search.php?query=libxslt

然后切换到root权限,安装新的包:

rpm -Uv libxml2-2.6.17-2.i386.rpm
rpm -Uv libxslt-1.1.12-4.i386.rpm

完成之后,就可以运行

xsltproc -version

检查安装是否完成。

安装之后,就可以使用xsltproc来生成HTML或者XSL-FO文件。

譬如,生成HTML

xsltproc  --output myfile.html  docbook-xsl/html/docbook.xsl myfile.xml

或者生成XSL-FO文档:

xsltproc --output myfile.fo docbook-xsl/fo/docbook.xsl myfile.xml

http://xmlsoft.org/XSLT/xsltproc2.html上列出了所有xsltproc的命令行参数,直接运行
xsltproc
也会打印出参数列表。

如果你只要发布HTML文档,那么到此为止。如果你还想发布PDF或是PS文档,那么需要安装XSL-FO处理程序。

4. 安装XSL-FO处理程序

XSL-FO处理程序根据XSLT处理程序生成的XSL-FO文件生成PDF或者PS文件。目前可供选择的XSL-FO处理程序远不如XSLT处理程序那么多,这是因为:

    a. XSL-FO
标准比XSLT标准的制订晚两年;

    b.XSL-FO
标准及其庞大而复杂,该标准的作者也发现其实现上的难度,从而将该标准分为基本、扩展和完整三个级别。

现在可用的免费的XSL-FO处理程序有:

    *FOP - 来自Apache XML项目。目前最新的版本是0.20.5,还在开发当中,还有很多特性不支持,不过已经可以满足一般的使用。
   
    *PassiveTeX -
来自Sebastian Rahtz (http://www.tei-c.org.uk/Software/passivetex/)一款基于TeXXSL-FO处理程序。同样也在开发中,较FOP要复杂的多。

另外有一些商业产品可供选择,可能生成的文档质量要比开源代码好,譬如:

    *XEP

    *XSL Formatter

下面介绍如何安装FOP

4.1.首先需要安装JDK,这个不用多说。

4.2. 下载FOP,可以选择tar或者zip压缩包。下载之后解压到本地。

4.3. 下载图形代码库。FOP自己不支持PNG之类的图片,如果在你的文档里会涉及到图片,那么需要下载额外的代码库。可以选择JAI,或者Jimi0.20.5之前的版本只能使用Jimi。下载之后,将jai_core.jarjai_codec.jarJAI),或者JimiProClasses.jarJimi)复制到FOP安装目录的lib目录下,然后在fop.batWindows平台)中添加

set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%"jai_core.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%"jai_codec.jar

或是
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%"JimiProClasses.zip

如果使用fop.shLinux平台),会自动搜索。

4.4. 添加扩展代码。如果Docbook XSL样式单有针对FOP的扩展代码(目前没有),像上面一样把它们添加到FOP安装目录下lib目录。

现在就可以使用FOP来生成PDF文档了。FOP提供两个脚本fop.batWindows平台)和fop.shUnixLinux平台)以方便使用。生成PDF的命令行如下:

    Linux
Unix
    fop.sh -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf
   
    Windows

    fop.bat -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf

在处理过程中,可能会提示某些属性不支持或尚未实现,不用理会这些提示,因为FOP仍处于开发中,这并不影响生成PDF文档。

到此,一个Docbook发布系统配置完成,并可以用来发布文档了。你完全可以在Linux上编写任务,通过该系统自动发布技术文档。


制作Docbook文档

1. 制作Docbook文档需要了解的知识:

1) XML - 这是最基本的,如果这个都不懂的话,最好先找本入门级的书看看;
2) DTD -
有助于你理解Docbook的结构;
3) XSL -
有助于定制自己的Docbook
4) XSL-FO -
最好了解一点,有助于更好的定制自己的PDF输出。

2. 制作Docbook文档的最简单的过程包括以下的步骤:

1) 编辑XML文件;
2)
XML文件进行处理,生成HTML或者PDF文档。

2.1. 编辑XML文件

如果使用纯文本编辑器来完成这项工作,我敢打赌一天之后你就做不下去了,直接编辑XML可是一件苦差事。使用类似XMLSPY这样的工具,提供自动填充功能,并且随时可以进行有效性检查,不容易出错,可以让工作轻松不少。

Docbook文档分两类:书(book)和文章(article)。article就是一般的文章,不包含章(chapter),只有节(section)。book比较完整,可以包含前言(preface),部分(part),章(chapter),文章(article)等等。以上描述的都是Docbook DTD定义的元素,这里不可能给出详细的说明,具体每个元素的结构参见Docbook DTD

让我们先来看一个book类型文档的典型定义:

            list 1. 典型的book类型文档
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
               "
http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<book>
 <bookinfo>
  <title>My Book</title>
  <author>
   <firstname>My First Name</firstname>
   <surname>My Last Name</surname>
  </author>
  <publisher>
   <publishername>CSDN</publishername>
  </publisher>
  <isbn>ISBN#</isbn>
  <copyright>
   <year>2005</year>
  </copyright>
 </bookinfo>
 <part>
  <title>My Part</title>
  <chapter>
   <title>My Chapter</title>
   <sect1>
    <title>My Section1</title>
    <para>This  is a demo of a book.</para>
   </sect1>
  </chapter>
 </part>
</book>

该文档声明使用的DTDhttp://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd,所有的内容都包含在book元素中,bookinfo元素包含书名(title)、作者(author)、出版社(publisher)、书号(isbn)和版权(copyright)。接着part元素包含的内容是该书的一个部分,下面有一章,接着有一节(sect1),当然都有各自的标题。

怎么样,各个元素的含义是不是很显而易见,根据元素的名称,你就能知道自己的内容该包含在什么元素里面。

在上面的例子里面,有些元素不是必须的。譬如bookinfo,可以没有或者有一个,看Docbook DTD就可以知道。

下面我以article类型的文档为例子,说明Docbook文档的制作过程。

首先是XML声明,说明文档的一些基本信息:

<?xml version="1.0" encoding="UTF-8"?>

紧接着是文档的DTD声明,说明文档使用的DTD还有根元素。典型的docbook文档的DTD声明如下:

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
               "
http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

这个声明表明,文档的根元素是<article>,使用外部DTD,该DTD用一个公共标识符"-//OASIS//DTD DocBook XML V4.2//EN"标识,该DTD位于网络的某处。标识符必须是全球唯一的,其形式为:

prefix//owner-identifier//text-class text-description//language//display-version

第一个prefix“+/-”“+”表示是已注册的标识,“-”则相反。其他各部分的含义自己对照。

接着就可以添加内容了。首先是根元素:

<article>

</article>

article必须有一个标题:

<article>
    <title>My Article</title>
</article>

标题之后必须有内容,不可能有无内容的文章:

<article>
     <title>My Article</title>
     <sect1>
      </sect1>
</article>

这里我们添加一个小节,“sect1”是小节的最顶层元素,其编排方式与MS Word“heading 1”类似。

article相同,sect1也必须有标题:

<article>
     <title>My Article</title>
     <sect1>
        <title>My Section</title>
      </sect1>
</article>

sect1也不允许无内容:

<article>
     <title>My Article</title>
     <sect1>
        <title>My Section</title>
        <para>This is my first article.</para>
      </sect1>
</article>

正文的内容一般用<para>元素封装,para即段落(paragraph)的意思。

现在就有了一个最简单的Docbook文档。list 2是完整的代码。

            list 2. 一个简单的article文档
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
               "
http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article>
     <title>My Article</title>
     <sect1>
          <title>My Section</title>
          <para>This is my first article.</para>
     </sect1>
</article>

编辑完成之后,保存为myarticle.xml,接着就可以生成HTML或者PDF了。

2.2 生成HTML

关于如何安装配置工具,参见安装配置Docbook”

我使用cygwin下的xsltproc来生成HTML,在cygwinshell中输入命令:

xsltproc --nonet --output myarticle.html c:/docbook-xsl-1.67.2/html/docbook.xsl myarticle.xml

--nonet表示我不希望从网络获取DTD,这样可以节省时间。

--output指定我希望输出的文件名,这里指定的是myarticle.html

紧接着是用来转换XML文件的XSL样式单,需要注意,使用的是html目录下的XSL样式单。

最后是要处理的Docbook文档。

没有意外的话,现在你就可以用浏览器打开myarticle.html看看效果了。

2.3 生成PDF文件

下面使用FOP生成PDF文件。关于如何安装配置FOP,参见http://blog.csdn.net/mickeyrat/archive/2005/02/06/283471.aspx

在控制台输入命令:

fop -xml myarticle.xml -xsl C:"docbook-xsl-1.67.2"fo"docbook.xsl myarticle.pdf

Linux的命令类似,注意docbook.xsl的路径。

-xml指定需要转换的docbook文档。

-xsl指定使用的样式单,注意,这里使用的fo目录下的样式单,这是专为转换XSL-FO开发的。

最后是输出文档的文件名。

FOP处理过程中,会输出许多诸如

property - "background-position-horizontal" is not implemented yet.

的信息。不用理会,这是因为FOP还在开发中,许多XSL-FO的特性都不支持。这样的问题并不影响最终文档的生成。

快打开myarticle.pdf看看效果吧,是不是很专业的PDF文档?

是不是觉得制作docbook文档很简单呢?这么想可就错了,本文剩余的部分介绍制作Docbook文档的高级技巧。

3. 定制自己的XSL样式单

当你开始正式制作自己的docbook文档之后,你会发现生成的文档并不能完全满足你对格式的要求,譬如章节号、页码、字体等等。这一节就告诉你如何定制自己的XSL样式单,生成满足特定需求的文档。下面的内容会涉及XSLXSL-FO

有人可能会想通过修改Docbook DTD达到定制目的,但是这种方式是不建议采用的,因为修改Docbook DTD之后,你的文档就不再是Docbook文档。

因为Docbook把内容与样式完全分开,所以修改XSL样式单,就能够改变输出结果。

为了修改样式单,你需要有自己的定制层,也就是基于Docbook XSL样式单之上开发自己的样式单。千万不要直接修改Docbook XSL样式单,这样做有两个缺点:

1) 不易维护:你的修改可能会分散在几十个文件中,过几天,你就会忘记自己修改过的地方。

2) 不易升级:如果你想升级样式到新的版本,你不得不把你所做的所有修改合并到新的版本中,合并的过程中肯定要处理大量的冲突,并且容易出错。

我想你应该知道<xsl:include><xsl:import>的区别:使用<xsl:include>引入的元素,如果有重复定义的,第一次出现的有效;使用<xsl:import>引入的元素,最后一个有效。定制层其实是依赖于XSL这样的一个特性,使用<xsl:import>引入Docbook XSL样式单的起点文件,然后添加自己的修改。list 3给出一个定制层文件的框架。

                             list 3 customization.xsl
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="
http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:import href="html/docbook.xsl"/>
    ...
    modifications
    ...
</xsl:stylesheet>

定制层是XSL文件,因此需要引入xsl的名字空间。在第三行,引入转换HTMLXSL样式单的起点文件docbook.xsl,如果是XSL-FO的定制层,起点文件在fo目录下。然后就可以添加自己的修改了。

定制分为两类,一类是修改样式单参数,一类是修改模板。

3.1 修改样式单参数

打开html/param.xsl或者fo/param.xsl,可以找到所有的样式单参数。看下面这个例子

<xsl:param name="section.autolabel" select="0"/>

参数的名字是“section.autolabel”,值为“0”。这个参数的作用是控制生成文档的时候是否对小节自动编号,譬如“1”“1.1”等等。“0”表示关闭自动编号。你可以看一下前面生成的文档,是不是没有章节号?

要打开自动编号,只需要这样修改:

<xsl:param name="section.autolabel" select="1"/>

你不是直接在param.xsl里面改的吧?如果是的话,赶紧改回来!千万记得,所有的修改都写在前面生成的customization.xsl。现在重新生成HTML

xsltproc --nonet --output myarticle.html c:/docbook-xsl-1.67.2/customization.xsl myarticle.xml

或生成PDF
fop -xml myarticle.xml -xsl C:"docbook-xsl-1.67.2"customization.xsl myarticle.pdf

注意,这个参数对HTMLXSL-FO都有效,但是你必须在customization.xsl中用<xsl:import>引入对应的起点文件,否则会报错。现在新的文档是不是出现章节号了?

再来一个。看你的PDF文档,肯定没有bookmark,因为在fo/param.xsl中,bookmark的功能被关闭了。在customization.xsl里添加:

<xsl:param name="fop.extensions" select="1"/>

这样FOP在处理的时候就会生成bookmark。注意这个参数的名字,“fop.extensions”,表示这个参数属于FOP的扩展,只对FOP有效。如果你使用PassiveTeX,那么需要设置“passivetex.extensions”

再来一个复杂点的:

<xsl:param name="formal.title.placement">
  figure after
  example before
  equation before
  table before
  procedure before
  task before
 </xsl:param>

这个参数作用于文章中的图、表等等元素的标题,控制标题的位置在前面(before)还是后面(after),param.xsl预定义的都是“before”,这里把figure的标题放在图的后面。这个参数对HTMLXSL-FO都有效。在你的文档中添加<figure>元素,重新生成文档,就可以看到效果。

3.2 修改模板

Docbook XSL提供很多的参数控制输出的效果。但是有时候,仅仅修改参数并不能满足所有的要求,这时,你就需要修改模板。

我们来看一个很现实的例子。XSL-FO定义了一类以“keep-”开头的属性,譬如“keep-with-next”,表示前面的内容与后面的内容必须在同一页,不能断开在两页上。但是除了table
FOP
目前不支持这样的属性。所以当文档比较长的时候,在FOP生成的PDF文档中,你会发现有某些小节的标题在一页的底部,而内容却在下一页,其他有标题的内容,譬如图,都会出现这样的情况。这当然是不合理的,可是无论你怎么添加“keep-”类的参数,都无济于事。

对于这样的情况,FOPFAQ告诉你的就是,对不起,我们还没有实现,至于什么时候实现,你别问,我也不知道

所以只能采取一个变通的方式。前面我说过,FOP对于table支持这样的属性,那么是否可以考虑把这样的内容放在table里面呢?当然可以,FOP有一个“blind table”的概念,这样的表除了其中的内容是不可见的,正符合我们的要求。现在的问题就是,Docbook XSL样式单生成的是通用的XSL-FO文件,不会把像<sect2>这种元素的内容放到“blind table”里面。那就只剩一条路了(其实还有一条,用商业产品^_^RenderXXEP支持“keep-”类属性),修改样式单模板。list 4的代码把<sect2>的内容放到一个“blind table”里面。
 
                       list 4. blindtable.xsl
<?xml version='1.0'?>
<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"/>

    <xsl:template match="sect2">
        <xsl:variable name="id">
            <xsl:call-template name="object.id"/>
        </xsl:variable>
  
        <fo:table table-layout="fixed" width="100%">
        <fo:table-column column-number="1"/>
        <fo:table-body>
              <fo:table-row keep-with-next="always">
                   <fo:table-cell id="{$id}" xsl:use-attribute-sets="section.level2.properties">
                       <xsl:call-template name="sect2.titlepage"/>
                   </fo:table-cell>
               </fo:table-row>
               <xsl:variable name="toc.params">
                  <xsl:call-template name="find.path.params">
                      <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
                  </xsl:call-template>
                  <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 2">
                       <xsl:call-template name="section.toc"/>
                       <xsl:call-template name="section.toc.separator"/>
                   </xsl:if>
               </xsl:variable>     
               <fo:table-row>
                   <fo:table-cell>
                       <xsl:apply-templates select="*[2]"/>
                   </fo:table-cell>
               </fo:table-row>
           </fo:table-body>
        </fo:table>
        <xsl:apply-templates select="*[position() > 2]"/>
    </xsl:template>
</xsl:stylesheet>

对于这段代码就不多做解释了,总的来说其作用就是覆盖了sections.xsl中定义的名为“sect2”的模板,在生成XSL-FO文件的时候,把<sect2>的标题和内容分别放到一个单列表的两行。因为这里用到了fo名字空间,所以在开始要引入fo名字空间。

重新生成PDF文件:

fop -xml yourarticle.xml -xsl C:"docbook-xsl-1.67.2"blindtable.xsl yourarticle.pdf

你会发现所有<sect2>的内容没有标题与内容断开在两页上的情况了。

4. 总结

到此为止,你已经了解制作Docbook的完整过程:

1) 编辑XML文档;
2)
生成HTML/PDF
3)
定制XSL样式单。

定制XSL样式单不能直接修改Docbook XSL样式单,需要创建一个新的XSL文件作为定制层。

XSL样式单定制有两类:

1) 修改XSL参数;
2)
修改XSL模板。

总之Docbook是十分强大的工具,可以用来制作非常专业漂亮的技术文档,甚至是其他文档。

你可能感兴趣的:(Docbook Beginning)