【问题标题】:If result document already exists, skip transformation如果结果文档已经存在,则跳过转换
【发布时间】:2012-09-03 02:32:19
【问题描述】:

我只想通过 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 中工作。我尝试使用 p:choose - 但我没有 p:otherwise 的输出管道,并且该过程总是失败。所以我猜使用 p:choose 不会带来所需的解决方案?

有什么想法吗?

亲切的问候 奥利弗

【问题讨论】:

  • 为什么不先使用单独的转换来查找文件是否已经存在。那么第二个转换如果不存在会运行吗?

标签: xml xslt xpath transform xproc


【解决方案1】:

这有点尴尬,因为您想跳过第一个 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"/>

HTH!

【讨论】:

  • 谢谢 - 它有效。不幸的是,又出现了一个问题。由于p:document/@href 在路径符号变量方面的限制,我需要加载源:&lt;p:load dtd-validate="false" name="indoc"&gt; &lt;p:with-option name="href" select="concat($myPath, '/output1.xml')"/&gt; &lt;/p:load&gt;。但是使用 p:load 不允许我定义导致我进入错误消息的输出,因为管道不同。
  • @user1659553 完全没有问题。加载本身已经有结果,就像缩进一样。您需要做的就是用负载替换身份,保留名称属性,它就会起作用。
  • @Geert - 再次感谢您的帮助。我刚刚将 p:load 添加到 p:otherwise 例程中(不删除 p:output)。我不知道为什么在我第一次试用时它不起作用。无论如何,您对 XProc 的理解有所帮助。
猜你喜欢
  • 2021-06-03
  • 2016-05-30
  • 2011-06-24
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 2014-03-02
  • 2019-10-18
  • 1970-01-01
相关资源
最近更新 更多