Последовательность ввода в <p: filter> в XProc 1.0?
Является <p:filter>
в XProc умеет принимать последовательность документов в качестве входных данных? Когда я кормлю калебаса следующим:
<?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 может применяться к XPath collection()
функции, это не ясно (ну, для меня), почему не должно быть возможно, по крайней мере, в принципе, фильтровать последовательность документов в XProc.
Я также не уверен, как читать спецификации, в которых говорится о <p:filter>
тот:
Этот шаг ведет себя так же, как p:input с выражением select, за исключением того, что выражение select вычисляется динамически.
поскольку <p:input>
может принять последовательность, если <p:filter>
говорят, что ведут себя так же, за исключением фильтрации, что, по-видимому, подразумевает, что <p:filter>
также должен быть в состоянии принять последовательность.
Я думаю, что варианты:
<p:filter>
принимает несколько входов, но я не указал это правильно.<p:filter>
не принимает несколько входов, и либо сообщение об ошибке и спецификация вводят в заблуждение, либо я не смог их правильно понять.
Я рад (хорошо, готов) признать себя виновным в ошибке пользователя в любом случае, но я был бы благодарен за разъяснение.
И да, я могу обойти проблему, используя <p:wrap-sequence>
сформировать несколько входов в одно дерево XML, но мой вопрос о том, как <p:filter>
работает, а не о том, как получить конкретный результат результата. В моем реальном коде чтение и передача моих реальных входных документов занимает 1,5 секунды и 4,5 секунды, если я добавлю шаг их обтекания, и я бы хотел сэкономить 3 секунды, особенно потому, что обертка была бы эфемерной работой. вокруг, так как я все равно собираюсь извлекать контент и заканчивать несколькими документами после шага фильтрации.
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>
Вы можете заметить, что исходный порт не объявлен с sequence="true"
Таким образом, второй вариант, который вы упомянули выше, является правильным.
В качестве обходного пути, вы действительно можете использовать <p:wrap>
,