要求: 是在输出xml上添加正确的Doctype声明【输入xml的根元素可以是chample或section元素】
输入 XML:chapter.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "docbookx.dtd">
<chapter>
<title>Chapter Template Title</title>
<para>Text</para>
<section>
<title>Section Title</title>
<para>Section text</para>
</section>
</chapter>
XSLT 文件:test.xsl:
- 样式表只是将输入 xml 复制到输出并在所有元素上添加 @sec
样式表将正确的 doctype 声明添加到输出 xml,因为输入 xml 根元素可以是 <chapter> 或 <section> 元素
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template name="add-doctype-declaration"> <xsl:choose> <xsl:when test="/chapter"> <xsl:text disable-output-escaping="yes"> <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "docbookx.dtd"> </xsl:text> </xsl:when> <xsl:when test="/section"> <xsl:text disable-output-escaping="yes"> <!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "docbookx.dtd"> </xsl:text> </xsl:when> </xsl:choose> </xsl:template> <xsl:template match="/"> <xsl:call-template name="add-doctype-declaration"/> <xsl:apply-templates/> </xsl:template> <!-- Identity Template --> <xsl:template match="@*|*|processing-instruction()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="section"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:attribute name="sec"> <xsl:number/> </xsl:attribute> <xsl:apply-templates/> </xsl:copy> </xsl:template> </xsl:stylesheet>
预期输出.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "docbookx.dtd">
<chapter>
<title>Chapter Template Title</title>
<para>Text</para>
<section sec="1">
<title>Section Title</title>
<para>Section text</para>
</section>
</chapter>
使用任何 XSLT 引擎,转换工作都非常好,并且能够获得预期的输出
但是,如果转换是通过 XProc 完成的,我最终会出现以下错误。有人可以帮助解决此错误吗
err:XD0001 : XD0001 如果非 XML 资源在步骤输出中生成或到达步骤输入,则为动态错误。
XProc 文件:test.xpl
<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0" name="testing">
<p:input port="source">
<p:document href="chapter.xml"/>
</p:input>
<p:output port="result">
<p:empty/>
</p:output>
<p:xslt version="1.0" name="transform">
<p:input port="stylesheet">
<p:document href="test.xsl"/>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
</p:xslt>
<p:store omit-xml-declaration="false" encoding="utf-8" name="serialize">
<p:with-option name="href" select="output.xml"/>
</p:store>
</p:declare-step>