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