要求:
输入XML1: chapter.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook Chap XML V4.5//EN" "chap.dtd">
<chapter>
<title>Chapter Template Title</title>
<para>Text</para>
<section>
<title>Section Title</title>
<para>Section text</para>
</section>
</chapter>输入XML2: section.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook Chap XML V4.5//EN" "chap.dtd">
<section>
<title>Section Title</title>
<para>Section text</para>
</section>XSLT文件: test.xsl:
样式表只是将输入xml复制到输出,并在所有部分元素上添加@sec,样式表为输出xml添加正确的doctype声明,因为输入xml根元素可以是或元素。
<?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 Chap XML V4.5//EN" "chap.dtd">
</xsl:text>
</xsl:when>
<xsl:when test="/section">
<xsl:text disable-output-escaping="yes">
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook Sec XML V4.5//EN" "sec.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>预期output.xml用于输入XML1
<?xml version="1.0" encoding="utf-8"?> Input XML1:
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook Chap XML V4.5//EN" "chap.dtd">
<chapter>
<title>Chapter Template Title</title>
<para>Text</para>
<section sec="1">
<title>Section Title</title>
<para>Section text</para>
</section>
</chapter>预期output.xml用于输入XML2
<?xml version="1.0" encoding="utf-8"?> Input XML1:
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook Sec XML V4.5//EN" "sec.dtd">
<section sec="1">
<title>Section Title</title>
<para>Section text</para>
</section>使用任何XSLT引擎,转换都能很好地工作,并且能够获得预期的输出。
但是,如果转换是通过XProc完成的,那么我将得到以下错误。有人能帮忙解决这个错误吗?
err: or 0001: 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>
<!-- Assume that there is another transform happening for chapter/section xml -->
<p:xslt version="1.0" name="transform2">
<p:input port="stylesheet">
<p:document href="test2.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>发布于 2013-03-21 00:04:59
再看一看
以下是两个简单的示例,说明您不需要对Doctype生成进行上下文化
区段http://www.sharexml.com/x/get?k=uWn0KA7RThnt
章节http://www.sharexml.com/x/get?k=wAJlbUJfzIYQ
回复后更新
如果您想动态地更改这个doctype
区段http://www.sharexml.com/x/get?k=pBAwCds86RnQ
章节http://www.sharexml.com/x/get?k=JHEWghzgWIq1
希望这能有所帮助
https://stackoverflow.com/questions/15536190
复制相似问题