我有一个XSLT样式表,它生成DocBook XML。我使用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样式表的问题?
发布于 2015-03-07 11:51:33
SGML允许只具有公共标识符的DOCTYPE,但XML需要系统标识符--您可以单独拥有系统ID,也可以拥有公共ID和系统ID,但不仅仅是公共ID。手册指南建议
<!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在这里确实有一个bug,但不是您认为的那个。来自xsl:output
如果指定了
doctype-system属性,则xml方法应该在紧接第一个元素之前输出一个文档类型声明。<!DOCTYPE后面的名称应该是第一个元素的名称。如果还指定了doctype-public属性,则xml方法应该输出PUBLIC,然后输出公共标识符,然后输出系统标识符;否则,它应该输出系统,然后输出系统标识符。内部子集应该是空的。除非指定了doctype-publicdoctype-system属性,否则应忽略属性。
(我的大胆)
https://stackoverflow.com/questions/28914220
复制相似问题