我的要求是在辅助端口中生成一个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内容。相反,它以HTML格式显示所有内容。这是因为上面代码段中的<p:store>
。
你如何有两个<p:store>
步骤? (一个用于HTML,另一个用于XML)
答案 0 :(得分:1)
如果您能够以某种方式确定写入辅助输出上的每个文档的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
的测试。
它还要求您在.xhtml
语句中使用xsl:result-document
作为HTML输出的扩展名,但如果您愿意,可以轻松调整它。
var
和choose
应足以让您的XML正确写入,至少。