`

[转]制作Docbook文档

阅读更多
[转]制作Docbook文档
原文链接:http://blog.csdn.net/mickeyrat/archive/2005/02/08/284270.aspx



制作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>

该文档声明使用的DTD为http://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,在cygwin的shell中输入命令:

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样式单,生成满足特定需求的文档。下面的内容会涉及XSL和XSL-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的名字空间。在第三行,引入转换HTML的XSL样式单的起点文件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

注意,这个参数对HTML和XSL-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的标题放在图的后面。这个参数对HTML和XSL-FO都有效。在你的文档中添加<figure>元 素,重新生成文档,就可以看到效果。

3.2 修改模板

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

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

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

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

安装配置Docbook

DocBook XSL: The Complete Guide


分享到:
评论

相关推荐

    DocBook文档管理工具

    DocBook is a very popular set of tags for describing books, articles, and other prose documents, particularly technical documentation. DocBook is defined using the native DTD syntax of SGML and XML. ...

    DocBook文档

    docbook - the definitive guide Writing documentation using DocBook

    word转换docbook工具

    word转换docbook工具,把word文档转换成XML文件格式

    docbook2asciidoc, 将DocBook转换为AsciiDoc的XSL.zip

    docbook2asciidoc, 将DocBook转换为AsciiDoc的XSL 这是将 DocBook 4.5转换为 AsciiDoc插件的样式表,最初由 bjepson 启动。依赖项这个项目有一个模块 ( https://github.com/oreillymedia/docbook2htmlbook ) 。

    DocBook

    关于的DocBook的资料, 本人看过,觉得很不错,讲解很详细,应该对想学习DocBook的人有些帮助

    DocBook5安装文件

    1 docbook-xsl-ns-1.75.2.zip解压到D:\docbook 2 另外四个压缩包解压出来,把里面的bin,include和lib三个文件夹拷贝到D:\docbook\xsltproc目录下 2 环境变量Path中增加 D:\docbook\xsltproc\bin 3 新建一个bat,...

    linux-3.2.4内核帮助文档DocBook

    内核API 内核帮助文档 DocBook Linux编程

    docbook4j:简单的可嵌入 Java 库,能够将 docbook 文档呈现为众所周知的目标格式(html、pdf、man 等)

    该项目的目的是创建一个简单的可嵌入 Java 库,能够将 docbook 文档呈现为众所周知的目标格式(html、pdf、man 等)。 Docbook4j 1.0.1 发布! 见 有关更详细的使用说明/教程,请参阅此博客文章 ( )。 Maven 用户请...

    DocBook学习笔记

    DocBook 是一种模式(在多种语言下可用,包括RELAX NG、SGML 和 XML DTDs ,以及 W3C XML 模式),它由OASIS 的DocBook 技术委员...全世界有许多组织将 DocBook 用于数百万页的文档,这些文档有不同的打印和在线格式。

    DocBook:权威指南DocBook: The Definitive Guide

    DocBook DTD的官方文档。 设计为对DocBook DTD的清晰,简洁,规范的参考。

    docbook 指南

    docbook 有关xml格式的文档说明。有需求的可以参考,非常不错。

    Writing Documentation Using DocBook

    DocBook提供了一个使用SGML/XML撰写结构化文档的系统。这个系统非常适合于计算机类的文章、书籍、论文等的出版,当然并不仅仅限于计算机类。DocBook已经被Linux、FreeBSD等众多的项目制定作为文档撰写格式,并且有...

    DocBook.5.0权威指南

    DocBook.5.0权威指南 DocBook 是非常流行的标记集合,用来描述书籍、论文,和其它文档,尤其是技术文档。 DocBook 是用 RELAX NG 方案和图解定义的 XML 词汇模型。

    windows下配置docbook

    windows下配置docbook 完整版教程,非常详细。我试了可以 本文主要介绍了Docbook开发过程中,遇到的环境搭建,常见问题以及解决办法,以及其他一些注意事项和基本 知识点

    docbook-xml-4.2.zip

    docbook-xml-4.2.zip docbook-xml-4.2.zip

    DocBook的使用指南(English Version)

    国内DocBook的使用还不普便,主要是相关使用文档,示例太少. 我自己写的一份Quick Reference的DocBook使用指南,希望能对国内DocBook的普及有一点点帮助.

    DocBook 5.0中文版

    DocBook 5.0 权威指南,中文版

    DocBook2.6.22.chm

    linux kernel2.6.22 API(DocBook) 采用make htmldocs命令生成,然后用html2chm转为chm

    XMLMind DocBook工具

    XMLMind DocBook工具

    docbook-xml-4.5.zip

    docbook用xml书写时的dtd

Global site tag (gtag.js) - Google Analytics