首页 > 解决方案 > 序列输入到在 XProc 1.0 中?

问题描述

XProc是否<p:filter>能够接受一系列文档作为输入?当我喂葫芦时:

<?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>

它引发以下错误:

err:XD0006 : 2 个文档出现在“源”端口上。如果未指定序列,或值为 false,则这是一个动态错误,除非在声明的端口上恰好出现一个文档。

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

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

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

除了选择表达式是动态计算的之外,此步骤的行为就像带有选择表达式的 p:input。

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

我认为选项是:

  1. <p:filter>接受多个输入,但我没有正确指定。
  2. <p:filter>不接受多个输入,并且错误消息和规范具有误导性,或者我未能正确理解它们。

我很高兴(好吧,愿意)在任何一种情况下都承认用户错误,但我会很感激澄清。

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

标签: xproc

解决方案


根据 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>

您会注意到端口没有用 声明sequence="true",因此您上面提到的第二个选项是正确的。

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


推荐阅读