Если результирующий документ уже существует, пропустите преобразование
Я просто хочу выполнить свои преобразования через 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"/>
НТН!