我的要求是在辅助端口中生成一个XML文件和几个HTML文件。我已经在XProc中配置了几个步骤。
以下是示例代码:
<p:xslt name="create-document">
<p:input port="stylesheet">
<p:document href="stylesheet.xsl" />
</p:input>
</p:xslt>
<p:for-each>
<p:iteration-source>
<p:pipe step="create-document" port="secondary" />
</p:iteration-source>
<p:store>
<p:with-option name="doctype-public" select="'-//W3C//DTD XHTML 1.0 Frameset//EN'" />
<p:with-option name="doctype-system" select="'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd'" />
<p:with-option name="encoding" select="'UTF-8'" />
<p:with-option name="media-type" select="'text/html'" />
<p:with-option name="method" select="'xhtml'" />
<p:with-option name="omit-xml-declaration" select="'no'" />
</p:store>
</p:for-each>这里的问题是HTML文件是正确生成的。并且生成了XML文件,但我无法查看XML内容。相反,由于上述代码片段中的<p:store>,它在HTML中显示了所有的format.This。
怎么会有两个<p:store>步骤呢?(一个用于HTML,另一个用于XML)
发布于 2011-11-24 23:12:48
如果您能以某种方式确定辅助输出上的每个文档都是用哪些xsl:result-document参数编写的,那就太好了。您可以将它们复制到您的p:store中。但是您可以从每个文档中派生出其他内容。您可以使用base-uri()检索文档名称,并且可以查看根元素。您可以使用以下命令将这些值放入变量中:
<p:variable name="path" select="base-uri(/*)"/>
<p:variable name="root" select="local-name(/*)"/>(将这些放在p:iteration-source下面。)
然后,您需要决定如何调用p:store。如果您的XProc解析器支持XPath 2.0 (就像XMLCalabash一样),那么您可以使用XPath。但我建议使用这样的p:choose:
<p:choose>
<p:when test="ends-with($path, '.xhtml')">
<p:store
doctype-public="-//W3C//DTD XHTML 1.0 Frameset//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"
encoding="UTF-8"
media-type="text/html"
method="xhtml"
omit-xml-declaration="no">
<p:with-option name="href" select="$path"/>
</p:store>
</p:when>
<p:otherwise>
<p:store
encoding="UTF-8"
media-type="application/xml"
method="xml"
omit-xml-declaration="no">
<p:with-option name="href" select="$path"/>
</p:store>
</p:otherwise>
</p:choose>(这个完整的p:choose将替换您已有的p:store。)
p:when中的测试只关注$path,但如果您愿意,也可以包含$root的测试。
它还要求您在xsl:result-document语句中使用.xhtml作为扩展,以获得HTML输出,但是如果您愿意,可以很容易地对其进行调整。
至少,var和choose应该足以正确地编写您的XML。
祝好运!
https://stackoverflow.com/questions/8199251
复制相似问题