在XProc 1.0中输入<p:filter>的顺序?

时间:2018-05-24 00:30:45

标签: xproc

XProc中的<p:filter>是否能够接受一系列文档作为输入?当我给Calabash喂食时:

<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step"
    version="1.0">
    <p:input port="source" sequence="true">
        <p:inline>
            <doc>
                <content>Hello world!</content>
            </doc>
        </p:inline>
        <p:inline>
            <doc>
                <content>Goodbye world!</content>
            </doc>
        </p:inline>
    </p:input>
    <p:output port="result" sequence="true"/>
    <p:filter select="//content">
        <p:input port="source" sequence="true"/>
    </p:filter>
</p:declare-step>

它引发了以下错误:

  

错误:XD0006:“源”端口上出现2个文档。如果未指定sequence,或者值为false,则除非在声明的端口上只显示一个文档,否则它是动态错误。

@sequence 指定,值为“true”。如果我从输入中删除第二个内联文档,则处理成功完成。如果我保留两个输入,但将<p:filter>替换为接受序列的其他内容,例如<p:count>,它也会成功运行完成。

我很困惑,因为错误消息并没有说<p:filter>无法接受序列;它告诉我指定一个序列,我已经做到了。由于XPath过滤可以应用于XPath collection()函数,因此不清楚(对我来说)为什么不应该在XProc中过滤一系列文档,至少在原理上是这样。

我也不确定如何阅读规范,其中说明了<p:filter>

  

这一步的行为就像一个带有select表达式的p:输入,除了   select表达式是动态计算的。

由于<p:input>可以接受序列,如果<p:filter>表示除了过滤之外的行为方式相同,那似乎意味着<p:filter>也应该能够接受序列。

我认为选项是:

  1. <p:filter>接受多个输入,但我没有正确指定。
  2. <p:filter>不接受多个输入,错误消息和规范都会产生误导,或者我无法正确理解它们。
  3. 我很高兴(嗯,愿意)在任何一种情况下认罪用户错误,但我很感激澄清。

    是的,我可以通过使用<p:wrap-sequence>在单个XML树中形成多个输入来解决此问题,但我的问题是<p:filter>如何工作,而不是如何获得具体结果。在我的实际代码中,读取并传递我的真实输入文档需要1.5秒,如果我添加包装它们的步骤需要4.5秒,我想保存3秒,特别是因为包装将是一个短暂的工作 - 因为我只是要在过滤步骤之后提取内容并结束多个文档。

1 个答案:

答案 0 :(得分:1)

根据XProc语言的建议,可以在7.1.9 p:filter读取以下步骤:

<p:declare-step type="p:filter">
     <p:input port="source"/>
     <p:output port="result" sequence="true"/>
     <p:option name="select" required="true"/>                     <!-- XPathExpression -->
</p:declare-step>

您可以注意到 source 端口未声明为sequence="true",因此您在上面提到的第二个选项是正确的。

作为解决方法,您确实可以使用<p:wrap>