Если результирующий документ уже существует, пропустите преобразование

Я просто хочу выполнить свои преобразования через XProc вместо использования командного сценария / сценария оболочки.

мой процесс преобразования представляет собой простую конкатенацию входных и выходных документов - поэтому выходные данные преобразования 1 являются входными данными преобразования 2. выходные данные преобразования 2 являются входными данными преобразования 3 и так далее.

Этот код описывает пример преобразования:

<p:xslt name="Transformation1">
    <p:input port="source">
        <p:document href="input.xml"/>
    </p:input>
    <p:input port="stylesheet">
        <p:document href="trans1.xsl"/>
    </p:input>
    <p:input port="parameters">
        <p:empty/>
    </p:input>
</p:xslt>

<p:store href="output1.xml"/> 

<p:xslt name="Transformation2">
    <p:input port="source">
        <p:pipe step="Transformation1" port="result"/>
    </p:input>
    <p:input port="stylesheet">
        <p:document href="trans2.xsl"/>
    </p:input>
    <p:input port="parameters">
        <p:empty/>
    </p:input>
</p:xslt>

<p:store href="output2.xml"/>

Это сработало, и дополнительно я получаю все временные документы с результатами, чтобы дважды проверить функциональность каждого XSLT-скрипта. Обработка сложных и многократных преобразований замедляет работу, потому что сценарий XProc всегда начинается с самого начала. Но я просто хочу что-то исправить при преобразовании 4. Обычно (используя пакет / оболочку) я просто удаляю выходные данные преобразования 4, исправляю скрипт XSLT и пропускаю все предыдущие преобразования от имени теста if (например, если существует output3.xml). перейти к преобразованию4). Как это сделать в сценарии XProc?

Шаблон XPath: not(doc-available(‘output1.xml’)) - в сочетании с xsl: если это работает в XSLT. Я пытался использовать a p: выбор - но у меня не было выходного конвейера для p: в противном случае, и процесс всегда терпел неудачу. Так что я думаю, что использование p:choose не приведёт к необходимому решению?

Есть идеи?

С наилучшими пожеланиями, Оливер

1 ответ

Это немного неловко, потому что вы хотите пропустить первый xslt, но вам нужно получить его вывод. Единственный способ сделать это - явно прочитать output1.xml, если он существует. Вы можете сделать это более или менее так:

<p:choose name="Transformation1">
    <p:when test="doc-available('output1.xml')">
        <p:output port="result">
            <p:pipe step="Transformation1-a" port="result"/>
        </p:output>
        <p:identity name="Transformation1-a">
            <p:input port="source">
                <p:document href="output1.xml"/>
            </p:input>
        </p:identity>
    </p:when>
    <p:otherwise>
        <p:output port="result">
            <p:pipe step="Transformation1-b" port="result"/>
        </p:output>
        <p:xslt name="Transformation1-b">
            <p:input port="source">
                <p:document href="input.xml"/>
            </p:input>
            <p:input port="stylesheet">
                <p:document href="trans1.xsl"/>
            </p:input>
            <p:input port="parameters">
                <p:empty/>
            </p:input>
        </p:xslt>

        <p:store href="output1.xml"/> 
    </p:otherwise>
</p:choose>

<p:xslt name="Transformation2">
    <p:input port="source">
        <p:pipe step="Transformation1" port="result"/>
    </p:input>
    <p:input port="stylesheet">
        <p:document href="trans2.xsl"/>
    </p:input>
    <p:input port="parameters">
        <p:empty/>
    </p:input>
</p:xslt>

<p:store href="output2.xml"/>

НТН!

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