0

我正在使用 XProc 运行一个 XSLT,它会输出大量结果文档(使用 xsl:result-document)。我不确定如何在步骤中为@href 添加变量。我有以下 XProc:

<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
<p:input port="source">
    <p:empty/>
</p:input>

<p:xslt name="pagelist">
    <p:input port="stylesheet">
        <p:document href="file:/C:/page-list.xsl"/>
    </p:input>
    <p:input port="source">
        <p:document href="file:/C:/toc.xml"/>
    </p:input>
    <p:input port="parameters">
        <p:empty/>
    </p:input>
</p:xslt>
<p:store name="pagelist" indent="true">
    <p:with-option name="method" select="'xml'" />
    <p:with-option name="href" select="" />
</p:store>

如何在 XProc 中添加一个与 xsl:result-document 中的输出文件名匹配的变量?

XSLT 片段,如果需要:

<xsl:result-document href="{xhtml:a[@class='ref-uri']/@id}_pagelist.xml" method="xml" include-content-type="no" indent="no">
4

1 回答 1

1

从命令行使用 Calabash 1.1.30 我能够得到以下工作:

<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xpath-version="2.0"
    xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
    <p:input port="source">
        <p:empty/>
    </p:input>

    <p:output port="result" primary="true" sequence="true">
        <p:pipe port="result" step="secondary-storage"/>
    </p:output>

    <p:xslt name="xslt-pagelist" version="2.0">
        <p:input port="stylesheet">
            <p:document href="page-list.xsl"/>
        </p:input>
        <p:input port="source">
            <p:document href="toc.xml"/>
        </p:input>
        <p:input port="parameters">
            <p:empty/>
        </p:input>
    </p:xslt>

    <p:store href="toc-list.html"/>

    <p:for-each name="secondary-storage">
        <p:iteration-source select=".">
            <p:pipe port="secondary" step="xslt-pagelist"/>
        </p:iteration-source>
        <p:output port="result">
            <p:pipe port="result" step="store"/>
        </p:output>
        <p:store name="store">
            <p:with-option name="href" select="document-uri(.)"/>
        </p:store>
    </p:for-each>

</p:declare-step>

所以基本上 a p:for-eachover ap:iteration-source使用步骤中的secondary结果输出端口p:xslt,然后在内部简单地使用document-uri(.)结果 URI。这一切都需要xpath-version="2.0".

不知何故 oXygen 22 不运行代码但给了我一个拒绝访问错误,它似乎设置为将辅助文档写入 oXygen 安装目录,不允许使用正常的 Windows 安全设置,也不是你想要结果的地方无论如何文件;为了解决这个问题,我调整了 XProc 以将 XML 输入作为整个 XProc 脚本的输入源,然后在p:xslt步骤中我可以使用该函数为 XSLTp:base-uri设置:output-base-uri

<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xpath-version="2.0"
    xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
    <p:input port="source">
        <p:document href="toc.xml"/>
    </p:input>

    <p:output port="result" primary="true" sequence="true">
        <p:pipe port="result" step="secondary-storage"/>
    </p:output>

    <p:xslt name="xslt-pagelist" version="2.0">
        <p:with-option name="output-base-uri" select="p:base-uri()"/>
        <p:input port="stylesheet">
            <p:document href="page-list.xsl"/>
        </p:input>
        <p:input port="parameters">
            <p:empty/>
        </p:input>
    </p:xslt>

    <p:store href="toc-list.html"/>

    <p:for-each name="secondary-storage">
        <p:iteration-source select=".">
            <p:pipe port="secondary" step="xslt-pagelist"/>
        </p:iteration-source>
        <p:output port="result">
            <p:pipe port="result" step="store"/>
        </p:output>
        <p:store name="store">
            <p:with-option name="href" select="document-uri(.)"/>
        </p:store>
    </p:for-each>

</p:declare-step>

这样,命令行和 oXygen 中的 Calabash 行为相同,将结果写入与输入源来源相同的目录。

于 2020-02-25T09:52:25.147 回答