XPROC - 在辅助端口中生成文件

时间:2011-11-20 03:27:54

标签: xproc

我的要求是在辅助端口中生成一个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)

1 个答案:

答案 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输出的扩展名,但如果您愿意,可以轻松调整它。

varchoose应足以让您的XML正确写入,至少。

祝你好运!