0

我只想通过 XProc 执行我的转换,而不是使用批处理/shell 脚本。

我的转换过程是输入和输出文档的简单串联 - 所以转换 1 的输出是转换 2 的输入。转换 2 的输出是转换 3 的输入,依此类推。

此代码描述了一个示例转换:

<p:xslt name="Transformation1">
    <p:input port="source">
        <p:document href="input.xml"/>
    </p:input>
    <p:input port="stylesheet">
        <p:document href="trans1.xsl"/>
    </p:input>
    <p:input port="parameters">
        <p:empty/>
    </p:input>
</p:xslt>

<p:store href="output1.xml"/> 

<p:xslt name="Transformation2">
    <p:input port="source">
        <p:pipe step="Transformation1" port="result"/>
    </p:input>
    <p:input port="stylesheet">
        <p:document href="trans2.xsl"/>
    </p:input>
    <p:input port="parameters">
        <p:empty/>
    </p:input>
</p:xslt>

<p:store href="output2.xml"/>

它起作用了,另外我得到了所有临时结果文档来仔细检查每个 XSLT 脚本的功能。处理复杂的多重转换会减慢速度——因为 XProc 脚本总是从头开始。但我只想在转换 4 处修复一些东西。通常(使用批处理/shell)我只是删除转换 4 的输出,修复 XSLT 脚本并代表 if-test 跳过所有先前的转换(例如,如果 output3.xml 存在转到转换4)。如何在 XProc 脚本中执行此操作?

XPath 模式是:not(doc-available(‘output1.xml’))- 与 xsl 结合使用:如果它在 XSLT 中工作。我尝试使用 ap:choose - 但我没有 p:otherwise 的输出管道,并且该过程总是失败。所以我猜使用 p:choose 不会提出所需的解决方案?

有任何想法吗?

亲切的问候奥利弗

4

1 回答 1

0

这有点尴尬,因为您想跳过第一个 xslt,但确实需要掌握它的输出。这样做的唯一方法是显式读取 output1.xml 以防它存在。你可以或多或少地这样做:

<p:choose name="Transformation1">
    <p:when test="doc-available('output1.xml')">
        <p:output port="result">
            <p:pipe step="Transformation1-a" port="result"/>
        </p:output>
        <p:identity name="Transformation1-a">
            <p:input port="source">
                <p:document href="output1.xml"/>
            </p:input>
        </p:identity>
    </p:when>
    <p:otherwise>
        <p:output port="result">
            <p:pipe step="Transformation1-b" port="result"/>
        </p:output>
        <p:xslt name="Transformation1-b">
            <p:input port="source">
                <p:document href="input.xml"/>
            </p:input>
            <p:input port="stylesheet">
                <p:document href="trans1.xsl"/>
            </p:input>
            <p:input port="parameters">
                <p:empty/>
            </p:input>
        </p:xslt>

        <p:store href="output1.xml"/> 
    </p:otherwise>
</p:choose>

<p:xslt name="Transformation2">
    <p:input port="source">
        <p:pipe step="Transformation1" port="result"/>
    </p:input>
    <p:input port="stylesheet">
        <p:document href="trans2.xsl"/>
    </p:input>
    <p:input port="parameters">
        <p:empty/>
    </p:input>
</p:xslt>

<p:store href="output2.xml"/>

于 2012-09-10T15:21:01.423 回答