Последовательность ввода вв XProc 1.0? - PullRequest
0 голосов
/ 24 мая 2018

Может ли <p:filter> в XProc принимать последовательность документов в качестве входных данных?Когда я передаю 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>

, возникает следующая ошибка:

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 Ответ

0 голосов
/ 24 мая 2018

Согласно рекомендации языка XProc, читается следующее определение шага на 7.1.9 p: фильтр :

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

...