我正在尝试编写一个需要按顺序执行几个p:xslt步骤的xproc。首先,它将两个规范化的XML文件写入磁盘,然后第三个p:xslt应该将这些规范化的文件作为输入。
UPDATE :第一个问题(第三个p:xslt在第二个p:store完成写入磁盘之前触发)通过在第二个p:store和第三个p之间添加显式连接来解决:XSLT。 (在下面的代码中修改)
更新2 下一个问题是我想用pxf:delete指令删除临时文件。这给出了相同的执行顺序问题:pxf:在将要删除的文件写入磁盘之前触发delete。 似乎pxf:delete上没有p:输入。因此,以前明确将步骤连接到最后一步的策略似乎是不可能的。有任何想法如何强制pxf:删除等待?
(以下问题已修改,抱歉一塌糊涂)
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>
答案 0 :(得分:0)
如果在XProc中执行转换以创建filename1和filename2,那么为什么不通过它们自己传递结果。只需在步骤中声明两个输入端口,并将早期转换的结果端口连接到自定义步骤的输入端口。没有临时文件,也不需要删除临时文件。
您当然可以编写中间结果,以便进行调试。没有什么能阻止你将一个结果端口连接到多个输入端口。
<强>更新强>
将早期变换的输出重定向为参数输入的方式与将前面步骤的输出重定向到后面步骤输入的方式相同。唯一的问题是你必须遵守参数的语法(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包含dummy 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>
HTH!