Как упростить этот конвейер xproc?
Я только что начал копаться в XProc (используя Calabash ). У меня есть ряд преобразований XSLT, которые я хочу применить к одному входному документу, чтобы создать один выходной документ. Ранее я использовал простой скрипт Python для управления преобразованиями,но мне показалось, что XProc может быть подходящим.
Конвейер ниже, кажется, работает для меня. По сути, это просто список преобразований XSLT, которые необходимо применить в правильном порядке. Проблема в том, что это кажется совершенно излишним. Я надеюсь, что есть какой-то способ сократить это, но (пока) я не могу понять это самостоятельно.
<?xml version="1.0"?>
<p:pipeline version="1.0" xmlns:p="http://www.w3.org/ns/xproc">
<p:xslt name="remove-locations">
<p:input port="stylesheet">
<p:document href="preprocessors/remove-locations.xsl"/>
</p:input>
</p:xslt>
<p:xslt name="divisions-1">
<p:input port="stylesheet">
<p:document href="preprocessors/divisions-1.xsl"/>
</p:input>
</p:xslt>
<p:xslt name="divisions-2">
<p:input port="stylesheet">
<p:document href="preprocessors/divisions-2.xsl"/>
</p:input>
</p:xslt>
<p:xslt name="subjects-1">
<p:input port="stylesheet">
<p:document href="preprocessors/subjects-1.xsl"/>
</p:input>
</p:xslt>
<p:xslt name="subjects-2">
<p:input port="stylesheet">
<p:document href="preprocessors/subjects-2.xsl"/>
</p:input>
</p:xslt>
<p:xslt name="types-1">
<p:input port="stylesheet">
<p:document href="preprocessors/types-1.xsl"/>
</p:input>
</p:xslt>
<p:xslt name="types-2">
<p:input port="stylesheet">
<p:document href="preprocessors/types-2.xsl"/>
</p:input>
</p:xslt>
<p:xslt name="core">
<p:input port="stylesheet">
<p:document href="preprocessors/core.xsl"/>
</p:input>
</p:xslt>
<p:xslt name="consolidate-descriptions">
<p:input port="stylesheet">
<p:document href="preprocessors/consolidate-descriptions.xsl"/>
</p:input>
</p:xslt>
</p:pipeline>
2 ответов:
Я обратился за помощью к списку рассылки xproc-dev, и решение было быстро предложено и реализовано для меня. Это позволило мне упростить вышеописанный конвейер вплоть до этого (пространства имен изменены для защиты невинных):
<?xml version="1.0"?> <p:pipeline version="1.0" xmlns:p="http://www.w3.org/ns/xproc" xmlns:ex="http://example.com"> <p:declare-step type="ex:xslt" name="xslt"> <p:input port="source" sequence="true" primary="true"/> <p:input port="parameters" kind="parameter"/> <p:output port="result" primary="true"/> <p:option name="stylesheet" required="true"/> <p:load name="load-stylesheet"> <p:with-option name="href" select="$stylesheet"/> </p:load> <p:xslt> <p:input port="stylesheet"> <p:pipe port="result" step="load-stylesheet"/> </p:input> <p:input port="source"> <p:pipe port="source" step="xslt"/> </p:input> </p:xslt> </p:declare-step> <ex:xslt stylesheet="remove-locations.xsl"/> <ex:xslt stylesheet="divisions-1.xsl"/> <ex:xslt stylesheet="divisions-2.xsl"/> <ex:xslt stylesheet="subjects-1.xsl"/> <ex:xslt stylesheet="subjects-2.xsl"/> <ex:xslt stylesheet="types-1.xsl"/> <ex:xslt stylesheet="types-2.xsl"/> <ex:xslt stylesheet="core.xsl"/> <ex:xslt stylesheet="consolidate-descriptions.xsl" /> </p:pipeline>(на самом деле я разделил шаг на его собственный файл и
<p:import>его, поэтому основной файл конвейера еще проще.)
Я не вижу способа упростить конвейер... если только вы не измените сами таблицы стилей. Например, создайте одну таблицу стилей, которая импортирует все остальные и продолжает передавать выходные данные одного на вход следующего. (Для этого потребуется XSLT 2.0 или расширение exsl:nodeset.)
Но нет, я не вижу способа упростить конвейер XProc без изменения других вещей.
Comments