0

我正在尝试编写一个需要按顺序执行多个 p:xslt 步骤的 xproc。首先,它将两个规范化的 XML 文件写入磁盘,然后第三个 p:xslt 应该将这些规范化的文件作为输入。

更新:第一个问题(第三个 p:xslt 在第二个 p:store 完成写入磁盘之前触发)通过在第二个 p:store 和第三个 p:xslt 之间添加显式连接来解决。(在下面的代码中修改)

更新 2下一个问题是我想用 pxf:delete 指令删除临时文件。这给出了相同的执行顺序问题: pxf:delete 在它应该删除的文件写入磁盘之前被触发。似乎在 pxf:delete 上没有 p:input 可能。因此,先前将步骤显式连接到最后一步的策略似乎是不可能的。任何想法如何强制 pxf:delete 等待?

(以下问题已修改,对混乱感到抱歉)

xproc 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step type="doc:compare_files" xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0" xmlns:cx="http://xmlcalabash.com/ns/extensions" name="current" xmlns:doc="http://technische-documentatie.oep.overheid.nl/namespaces/doc" xmlns:pxf="http://xmlcalabash.com/ns/extensions/fileutils" >
<p:output port="result">
  <p:pipe port="result" step="big_transform"/>
</p:output>

<p:option name="filename1" required="true"/>
<p:option name="filename2" required="true"/> 

<p:load name="load-filename1">
  <p:with-option name="href" select="$filename1"/>
</p:load>

<p:load name="load-filename2">
  <p:with-option name="href" select="$filename2"/>
</p:load>

<p:xslt name="prepare_transform_1">
  <p:input port="source">
     <p:pipe port="result" step="load-filename1"/>
  </p:input>
  <p:input port="stylesheet">
    <p:document href="prepare_for_hash_identity_transform.xsl"/>
  </p:input>
  <p:input port="parameters" kind="parameter" sequence="true">
    <p:inline>
      <c:param-set>
        <c:param name="commentsFilteren" value="ja"/>
      </c:param-set>
    </p:inline>
  </p:input>
 </p:xslt>

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

<p:xslt name="prepare_transform_2">
  <p:input port="source">
    <p:pipe port="result" step="load-filename2"/>
  </p:input>
  <p:input port="stylesheet">
    <p:document href="prepare_for_hash_identity_transform.xsl"/>
  </p:input>
  <p:input port="parameters" kind="parameter" sequence="true">
    <p:inline>
      <c:param-set>
        <c:param name="commentsFilteren" value="ja"/>
      </c:param-set>
    </p:inline>
  </p:input>
 </p:xslt>

<p:store href="t2.xml" name="store2"/>

<p:xslt name="big_transform">
  <p:input port="source">
     <p:pipe port="result" step="store2">
  </p:input>
  <p:input port="stylesheet">
    <p:document href="generate_hash.xsl"/>
  </p:input>
  <p:input port="parameters" kind="parameter" sequence="true">
    <p:inline>
      <c:param-set>
        <c:param name="file1" value="t1.xml"/>
        <c:param name="file2" value="t2.xml"/>
      </c:param-set>
    </p:inline>
   </p:input>
</p:xslt>

<p:import href="http://xmlcalabash.com/extension/steps/fileutils.xpl"/>
<pxf:delete href="t1.xml"/>
<pxf:delete href="t2.xml"/>

</p:declare-step>
4

1 回答 1

1

如果您在 XProc 中执行转换以创建文件名 1 和文件名 2,那么为什么不通过它们自己传递结果。只需在步骤上声明两个输入端口,并将先前转换的结果端口连接到自定义步骤的输入端口。没有临时文件,也不需要删除临时文件。

当然,出于调试目的,您仍然可以编写中间结果。没有什么能阻止您将一个结果端口绑定到多个输入端口。

更新:

将早期转换的输出重定向为参数输入的方式与将早期步骤的输出重定向到后面步骤的输入的方式相同。唯一的问题是您必须符合参数的语法(c:param-set/c:param 等)。因此,如果您之前的转换产生了该语法,那么您可以这样做:

<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step type="doc:compare_files" xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0" xmlns:cx="http://xmlcalabash.com/ns/extensions" name="current" xmlns:doc="http://technische-documentatie.oep.overheid.nl/namespaces/doc" xmlns:pxf="http://xmlcalabash.com/ns/extensions/fileutils" >
<p:input port="file1"/>

<p:input port="file2"/>

<p:output port="result">
  <p:pipe port="result" step="big_transform"/>
</p:output>

<p:xslt name="prepare_transform_1">
  <p:input port="source">
     <p:pipe port="file1" step="current"/>
  </p:input>
  <p:input port="stylesheet">
    <p:document href="prepare_for_hash_identity_transform.xsl"/>
  </p:input>
  <p:input port="parameters" kind="parameter" sequence="true">
    <p:inline>
      <c:param-set>
        <c:param name="param-name" value="file1"/>
        <c:param name="commentsFilteren" value="ja"/>
      </c:param-set>
    </p:inline>
  </p:input>
 </p:xslt>

<p:xslt name="prepare_transform_2">
  <p:input port="source">
    <p:pipe port="file2" step="current"/>
  </p:input>
  <p:input port="stylesheet">
    <p:document href="prepare_for_hash_identity_transform.xsl"/>
  </p:input>
  <p:input port="parameters" kind="parameter" sequence="true">
    <p:inline>
      <c:param-set>
        <c:param name="param-name" value="file2"/>
        <c:param name="commentsFilteren" value="ja"/>
      </c:param-set>
    </p:inline>
  </p:input>
 </p:xslt>

<p:xslt name="big_transform">
  <p:input port="source">
     <p:pipe port="file2" step="current"/>
  </p:input>
  <p:input port="stylesheet">
    <p:document href="generate_hash.xsl"/>
  </p:input>
  <p:input port="parameters" kind="parameter" sequence="true">
    <p:pipe port="result" step="prepare_transform_1"/>
    <p:pipe port="result" step="prepare_transform_2"/>
   </p:input>
</p:xslt>

</p:declare-step>

我用这个命令行测试了它:

calabash --input file1=file1.xml --input file2=file2.xml --output result=out.xml test.xpl

file1.xml 和 file2.xml 包含虚拟 xml ( <x/>)。prepare_for_hash_identity_transform.xsl 包含:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:c="http://www.w3.org/ns/xproc-step">

    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

    <xsl:strip-space elements="*" />

    <xsl:param name="param-name"/>

    <xsl:template match="/">
        <c:param-set>
            <c:param name="{$param-name}" value="{base-uri(/)}"/>
        </c:param-set>
    </xsl:template>

</xsl:stylesheet>

generate_hash.xsl 包含:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:c="http://www.w3.org/ns/xproc-step">

    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

    <xsl:strip-space elements="*" />

    <xsl:param name="file1"/>
    <xsl:param name="file2"/>

    <xsl:template match="/">
        <c:param-set>
            <c:param name="file1" value="{$file1}"/>
            <c:param name="file2" value="{$file2}"/>
        </c:param-set>
    </xsl:template>

</xsl:stylesheet>

于 2013-11-19T16:10:40.307 回答