Последовательность ввода в <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> также должен быть в состоянии принять последовательность.

Я думаю, что варианты:

  1. <p:filter> принимает несколько входов, но я не указал это правильно.
  2. <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>,

Другие вопросы по тегам