建议使用什么工具链来格式化XML DocBook?

时间:2020-03-06 14:36:58  来源:igfitidea点击:

我已经看到了使用DocBook XML文档的最佳工具,但是我的问题略有不同。与XML DocBook的编辑工具相对,当前建议使用哪种格式化工具链?

在2003年埃里克·雷蒙德(Eric Raymond)的" Unix编程的艺术"(一本好书!)中,建议是XML-FO(XML格式化对象),但此后我看到了一些建议,这些建议表明XML-FO不再在开发中。 (尽管我再也无法在StackOverflow上找到该问题,所以也许这是错误的)。

假设我主要对Unix / Linux(包括MacOS X)感兴趣,但是我不会自动忽略仅Windows的解决方案。

Apache的FOP是最好的方式吗?有其他选择吗?

解决方案

一种流行的方法是使用DocBook XSL样式表。

我一直在使用cygwin下的DocBook做一些手动编写,以生成一页HTML,多页HTML,CHM和PDF。

我安装了以下内容:

  • docbook样式表(xsl)存储库。
  • xmllint,以测试xml是否正确。
  • xsltproc,用于处理带有样式表的xml。
  • Apache的fop,用于生成PDF。我确保将已安装的文件夹添加到PATH。
  • Microsoft的HTML帮助研讨会,以生成CHM。我确保将已安装的文件夹添加到PATH中。

编辑:在下面的代码中,我正在使用两个以上的文件。如果有人想要清理脚本和文件夹结构的版本,请与我联系:guscarreno(波浪形/ at)googlemail(句点/点)com

然后,我使用configure.in:

AC_INIT(Makefile.in)

FOP=fop.sh
HHC=hhc
XSLTPROC=xsltproc

AC_ARG_WITH(fop, [  --with-fop  Where to find Apache FOP],
[
    if test "x$withval" != "xno"; then
        FOP="$withval"
    fi
]
)
AC_PATH_PROG(FOP,  $FOP)

AC_ARG_WITH(hhc, [  --with-hhc  Where to find Microsoft Help Compiler],
[
    if test "x$withval" != "xno"; then
        HHC="$withval"
    fi
]
)
AC_PATH_PROG(HHC,  $HHC)

AC_ARG_WITH(xsltproc, [  --with-xsltproc  Where to find xsltproc],
[
    if test "x$withval" != "xno"; then
        XSLTPROC="$withval"
    fi
]
)
AC_PATH_PROG(XSLTPROC,  $XSLTPROC)

AC_SUBST(FOP)
AC_SUBST(HHC)
AC_SUBST(XSLTPROC)

HERE=`pwd`
AC_SUBST(HERE)
AC_OUTPUT(Makefile)

cat > config.nice <<EOT
#!/bin/sh
./configure \
    --with-fop='$FOP' \
    --with-hhc='$HHC' \
    --with-xsltproc='$XSLTPROC' \

EOT
chmod +x config.nice

和一个Makefile.in:

FOP=@FOP@
HHC=@HHC@
XSLTPROC=@XSLTPROC@
HERE=@HERE@

# Subdirs that contain docs
DOCS=appendixes chapters reference 

XML_CATALOG_FILES=./build/docbook-xsl-1.71.0/catalog.xml
export XML_CATALOG_FILES

all:    entities.ent manual.xml html

clean:
@echo -e "\n=== Cleaning\n"
@-rm -f html/*.html html/HTML.manifest pdf/* chm/*.html chm/*.hhp chm/*.hhc chm/*.chm entities.ent .ent
@echo -e "Done.\n"

dist-clean:
@echo -e "\n=== Restoring defaults\n"
@-rm -rf .ent autom4te.cache config.* configure Makefile html/*.html html/HTML.manifest pdf/* chm/*.html chm/*.hhp chm/*.hhc chm/*.chm build/docbook-xsl-1.71.0
@echo -e "Done.\n"

entities.ent: ./build/mkentities.sh $(DOCS)
@echo -e "\n=== Creating entities\n"
@./build/mkentities.sh $(DOCS) > .ent
@if [ ! -f entities.ent ] || [ ! cmp entities.ent .ent ]; then mv .ent entities.ent ; fi
@echo -e "Done.\n"

# Build the docs in chm format

chm:    chm/htmlhelp.hpp
@echo -e "\n=== Creating CHM\n"
@echo logo.png >> chm/htmlhelp.hhp
@echo arrow.gif >> chm/htmlhelp.hhp
@-cd chm && "$(HHC)" htmlhelp.hhp
@echo -e "Done.\n"

chm/htmlhelp.hpp: entities.ent build/docbook-xsl manual.xml build/chm.xsl
@echo -e "\n=== Creating input for CHM\n"
@"$(XSLTPROC)" --output ./chm/index.html ./build/chm.xsl manual.xml

# Build the docs in HTML format

html: html/index.html

html/index.html: entities.ent build/docbook-xsl manual.xml build/html.xsl
@echo -e "\n=== Creating HTML\n"
@"$(XSLTPROC)" --output ./html/index.html ./build/html.xsl manual.xml
@echo -e "Done.\n"

# Build the docs in PDF format

pdf:    pdf/manual.fo
@echo -e "\n=== Creating PDF\n"
@"$(FOP)" ./pdf/manual.fo ./pdf/manual.pdf
@echo -e "Done.\n"

pdf/manual.fo: entities.ent build/docbook-xsl manual.xml build/pdf.xsl
@echo -e "\n=== Creating input for PDF\n"
@"$(XSLTPROC)" --output ./pdf/manual.fo ./build/pdf.xsl manual.xml

check: manual.xml
@echo -e "\n=== Checking correctness of manual\n"
@xmllint --valid --noout --postvalid manual.xml
@echo -e "Done.\n"

# need to touch the dir because the timestamp in the tarball
# is older than that of the tarball :)
build/docbook-xsl: build/docbook-xsl-1.71.0.tar.gz
@echo -e "\n=== Un-taring docbook-xsl\n"
@cd build && tar xzf docbook-xsl-1.71.0.tar.gz && touch docbook-xsl-1.71.0

自动生成上述文件输出。

我宁愿使用nix方法编写脚本,只是因为该工具集更易于查找和使用,更不用说更易于链接了。

关于Apache FOP的问题:当我们建立工具链(类似于Gustavo提出的建议)时,我们使用RenderX XEP引擎取得了很好的结果。 XEP的输出看起来更加精细,据我所记得,FOP在表方面存在一些问题(尽管这是几年前的事,但可能已经改变了)。

DocBook样式表以及FOP都可以很好地工作,但我最终决定采用RenderX,它更全面地涵盖了该标准,并具有DocBook样式表可利用的一些不错的扩展。

鲍勃·斯坦顿(Bob Stayton)的书《 DocBook XSL:完整指南》描述了几种备用工具链,包括可在Linux或者Windows上使用的工具链(几乎可以肯定是MacOS,尽管我个人并未使用Mac)。

我们使用XMLmind XmlEdit进行编辑,并使用Maven的docbkx插件在构建过程中创建输出。对于一组好的模板,请看一下Hibernate或者Spring提供的模板。

对于HTML输出,我将Docbook XSL样式表与XSLT处理器xsltproc一起使用。

对于PDF输出,我使用dblatex,后者会转换为LaTeX,然后使用pdflatex将其编译为PDF。 (我以前使用过Jade,DSSSL样式表和jadetex。)

我们用

  • Serna XML编辑器
  • Eclipse(普通xml编辑,主要由技术人员使用)
  • 自己的特定Eclipse插件(仅适用于我们的发行说明)
  • Maven docbkx插件
  • 基于标准docbook样式表的具有特定公司样式表的Maven jar
  • Maven插件,用于将csv转换为DocBook表
  • Maven插件,用于提取BugZilla数据并从中创建DocBook部分
  • 哈德森(生成PDF文档)
  • Nexus部署创建的PDF文档

我们有一些想法:

与每个产品版本一起部署,不仅是PDF,还包括原始的完整DocBook文档(因为我们部分编写文档并部分生成文档)。保存完整的DocBook文档可以使它们独立于将来对系统设置的更改。这意味着,如果系统发生更改,从中提取内容(或者由差异系统替换),我们将无法再生成确切的内容。如果我们需要重新发布(使用不同的样式表)整个手册手册,可能会引起问题。与罐子一样;这些已编译的Java类也放置在Nexus中(我们不想将它们存储在SCM中);我们也将对生成的DocBook文档执行此操作。

更新:

Fresh创建了一个Maven HTML Cleaner插件,从而可以将DocBook内容添加到Maven项目站点(可用的Beta版本)。欢迎通过公开讨论论坛提供反馈。

使用FOP,我们可以获得某些人认为他们想要实现的功能。我要说的是,没有人认真对待出版工作。使用RenderX或者Antenna House或者Arbortext可以获得更好的收益。 (在过去十年的实施项目中,我都使用过它们。)这取决于业务需求,要实现的自动化程度以及团队的技能,时间和资源。这不仅仅是一个技术问题。

如果我们使用的是Red Hat,Ubuntu或者Windows,则可以看看Publican,它应该是相当完整的命令行工具链。红帽广泛使用它。

  • Wiki在这里:https://fedorahosted.org/publican/
  • Doc在这里:http://jfearn.fedorapeople.org/Publican/
  • 源tarball和exes在这里:https://fedorahosted.org/releases/p/u/publican/