0

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

4

1 回答 1

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

它还要求您在 HTML 输出的语句中使用.xhtml扩展xsl:result-document,但如果您愿意,可以轻松调整它。

和至少应该足以让您的 XML 正确编写varchoose

祝你好运!

于 2011-11-24T15:12:48.323 回答