首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xproc (葫芦):执行顺序

Xproc (葫芦):执行顺序
EN

Stack Overflow用户
提问于 2013-11-19 09:09:39
回答 1查看 368关注 0票数 0

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

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

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

(下面的问题修改了,很抱歉弄得一团糟)

xproc如下所示:

代码语言:javascript
运行
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 16:10:40

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

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

更新:

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

代码语言:javascript
运行
复制
<?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>

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

代码语言:javascript
运行
复制
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包含:

代码语言:javascript
运行
复制
<?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包含:

代码语言:javascript
运行
复制
<?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>

哈哈!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20067339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档