这两天在研究DocBook,打算以后用它来写点东西,可以方便地转换成任意格式。国内DocBook的入门文章不多, 推荐读读这篇:《DocBook 助你完成传世之作》, 虽然目前还没有完成,但一些入门的基础知识还是讲得不错的。

至于编译环境,我推荐使用Linux发行版自带的编译环境,一般都是已经配置好的。 我尝试了Fedora Core 6自带的环境,SGML和XML都能用,还不错。

需要安装以下这些包:

  • dialog-1.0.20051107-1.2.2.i386.rpm
  • docbook-dtds-1.0-30.1.noarch.rpm
  • docbook-simple-1.0-2.1.1.noarch.rpm
  • docbook-slides-3.3.1-2.1.1.noarch.rpm
  • docbook-style-dsssl-1.79-4.1.noarch.rpm
  • docbook-style-xsl-1.69.1-5.1.noarch.rpm
  • docbook-utils-0.6.14-5.1.noarch.rpm
  • docbook-utils-pdf-0.6.14-5.1.noarch.rpm
  • jadetex-3.12-13.1.1.noarch.rpm
  • netpbm-10.35-6.fc6.i386.rpm
  • netpbm-progs-10.35-6.fc6.i386.rpm
  • openjade-1.3.2-27.i386.rpm
  • opensp-1.5.2-3.1.i386.rpm
  • perl-SGMLSpm-1.03ii-16.2.1.noarch.rpm
  • psutils-1.17-26.1.i386.rpm
  • sgml-common-0.6.3-18.noarch.rpm
  • tetex-3.0-32.fc6.i386.rpm
  • tetex-dvips-3.0-32.fc6.i386.rpm
  • tetex-fonts-3.0-32.fc6.i386.rpm
  • tetex-latex-3.0-32.fc6.i386.rpm
  • xml-common-0.6.3-18.noarch.rpm

装完之后,SGML的样式表位于 /usr/share/sgml/docbook/dsssl-stylesheets-1.79, XML的样式表位于/usr/share/sgml/docbook/xsl-stylesheets-1.69.1-5.1。 建议将这两个目录在当前目录下建立符号链接,以便于输入:

ln -s /usr/share/sgml/docbook/dsssl-stylesheets-1.79/ dsssl
ln -s /usr/share/sgml/docbook/xsl-stylesheets-1.69.1-5.1/ xsl

SGML的编译方法:建立一个测试文档 hello.sgml:

<?xml version="1.0" ?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN">
<book>
    <article>
    <articleinfo>
        <title>Hello World!</title>
        <author><firstname></firstname><surname></surname></author>
    </articleinfo>

    <sect1><title>Hello World!</title>
        <para>
        Hello world! 这是我的第一个 DocBook 文档。
        </para>
    </sect1>
    </article>
</book>

然后用如下命令行即可编译成HTML:

$ openjade -E 0 -t sgml -d dsssl/html/docbook.dsl hello.sgml

而XML相对简单些,测试文档 hello.xml 如下:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
                         "http://docbook.org/xml/4.1.2/docbookx.dtd">
<book lang="zh-CN">
        <title>你好,世界!</title>
        <article>
        <articleinfo>
                <title>Hello World!</title>
                <author><firstname></firstname><surname></surname></author>
        </articleinfo>

        <sect1><title>Hello World!</title>
                <para>
                Hello world! 这是我的第一个 DocBook 文档。
                </para>
        </sect1>
        </article>
</book>

编译命令行:

$ xsltproc --nonet -o index.html xsl/html/docbook.xsl hello.xml

不过这时如果你查看生成的index.html的源代码,会发现汉字是被编码成&#31532;这样的形式的。 这是因为默认的样式表的编码方式为ISO-8859-1,不能识别汉字。我们要将它改成UTF-8。 可以参考这里:Output encoding

建立自己的样式表 hello.xsl:

<?xml version='1.0'?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:import href="xsl/html/docbook.xsl"/>
<xsl:output method="html" encoding="UTF-8" indent="no"/>
</xsl:stylesheet>

然后转换:

$ xsltproc --nonet -o index.html hello.xsl hello.xml

这样转换结果中的汉字就原样显示了。

相对来说我更喜欢XML格式,一是因为它的语法比SGML简单些,二是因为转换结果的HTML比较漂亮。

另外,如果你想自己搭建DocBook的编译环境,可以参考这篇文章:

一些DocBook的参考资料:

2009/2/5更新:在cygwin下安装docbook也相当简单,只需安装这几个包即可:

  • docbook-xml412
  • docbook-xsl
  • libxslt
  • libxml2
  • openjade
  • OpenSP
  • libgpg-error

2009/2/19更新:如果想把每个章节都做到不同的html文件中(即chunk形式),可以这样定义xsl(已解决汉字被编码成&#31532;的问题):

<?xml version='1.0'?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:import href="/usr/share/sgml/docbook/xsl-stylesheets-1.69.1-5.1/html/chunk.xsl"/>
<xsl:param name="chunker.output.encoding" select="'UTF-8'"/>
</xsl:stylesheet>