xsltproc:docbook的doctype

时间:2015-03-07 11:06:39

标签: xml xslt docbook

我有一个生成DocBook XML的XSLT样式表。我使用xsl:output为docbook

生成DOCTYPE声明
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0"
              doctype-public="-//OASIS//DTD DocBook XML V4.5//EN"
             encoding="utf-8"
             indent="no" />

生成的XML文件有一个额外的空字符串,因此xmllint会抱怨:

/path/docbk.xml:2: parser error : Content error in the external subset
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" ""><book>
^

这是xsltproc或XSLT样式表的问题吗?

1 个答案:

答案 0 :(得分:2)

SGML允许DOCTYPE仅具有PUBLIC标识符,但XML 需要系统标识符 - 您可以单独使用系统ID,也可以使用公共ID和系统ID,但不仅仅是公共ID 。 The docbook guide建议

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

对应

<xsl:output method="xml" version="1.0"
            doctype-public="-//OASIS//DTD DocBook XML V4.5//EN"
            doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
            encoding="utf-8"
            indent="no" />

事实上,xsltproc 确实在这里有一个错误,但不是你想到的错误。来自the spec for xsl:output

  

如果指定了doctype-system属性,则xml输出方法应在第一个元素之前输出文档类型声明<!DOCTYPE后面的名称应该是第一个元素的名称。如果还指定了doctype-public属性,则xml输出方法应输出PUBLIC,后跟公共标识符,然后输出系统标识符;否则,应输出SYSTEM后跟系统标识符。内部子集应为空。 除非指定doctype-public属性,否则应忽略doctype-system属性。

(我的大胆)