【问题标题】:xsltproc: doctype for docbookxsltproc: docbook 的文档类型
【发布时间】:2015-03-07 19:57:44
【问题描述】:

我有一个生成 DocBook XML 的 XSLT 样式表。我使用xsl:output 为文档生成了一个 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 样式表的问题?

【问题讨论】:

    标签: xml xslt docbook


    【解决方案1】:

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

    (我的粗体字)

    【讨论】:

      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多