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>
也应该能够接受一个序列。
我认为选项是:
<p:filter>
接受多个输入,但我没有正确指定。<p:filter>
不接受多个输入,并且错误消息和规范具有误导性,或者我未能正确理解它们。
我很高兴(好吧,愿意)在任何一种情况下都承认用户错误,但我会很感激澄清。
<p:wrap-sequence>
是的,我可以通过使用将多个输入形成单个 XML 树来解决该问题,但我的问题是关于如何<p:filter>
工作,而不是关于如何获得特定的结果结果。在我的实际代码中,读取和传递我的真实输入文档需要 1.5 秒,如果我添加包装它们的步骤,则需要 4.5 秒,我想节省 3 秒,特别是因为包装将是一个短暂的工作 -左右,因为无论如何我只是要提取内容并在过滤步骤之后得到多个文档。