XPro c p: хранить переменную href при использовании xsl: result-document - PullRequest
0 голосов
/ 25 февраля 2020

Я использую XPro c для запуска XSLT, который выплевывает множество документов результатов (используя xsl: result-document). Я не уверен, как go добавить переменную для @href в этом шаге. У меня есть следующее XPro c:

<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">
    <p:empty/>
</p:input>

<p:xslt name="pagelist">
    <p:input port="stylesheet">
        <p:document href="file:/C:/page-list.xsl"/>
    </p:input>
    <p:input port="source">
        <p:document href="file:/C:/toc.xml"/>
    </p:input>
    <p:input port="parameters">
        <p:empty/>
    </p:input>
</p:xslt>
<p:store name="pagelist" indent="true">
    <p:with-option name="method" select="'xml'" />
    <p:with-option name="href" select="" />
</p:store>

Как добавить переменную в XPro c, которая будет соответствовать имени выходного файла из xsl: result- документ?

фрагмент XSLT, если необходимо:

<xsl:result-document href="{xhtml:a[@class='ref-uri']/@id}_pagelist.xml" method="xml" include-content-type="no" indent="no">

1 Ответ

1 голос
/ 25 февраля 2020

Используя Cala bash 1.1.30 из командной строки, я смог заставить работать следующее:

<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xpath-version="2.0"
    xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
    <p:input port="source">
        <p:empty/>
    </p:input>

    <p:output port="result" primary="true" sequence="true">
        <p:pipe port="result" step="secondary-storage"/>
    </p:output>

    <p:xslt name="xslt-pagelist" version="2.0">
        <p:input port="stylesheet">
            <p:document href="page-list.xsl"/>
        </p:input>
        <p:input port="source">
            <p:document href="toc.xml"/>
        </p:input>
        <p:input port="parameters">
            <p:empty/>
        </p:input>
    </p:xslt>

    <p:store href="toc-list.html"/>

    <p:for-each name="secondary-storage">
        <p:iteration-source select=".">
            <p:pipe port="secondary" step="xslt-pagelist"/>
        </p:iteration-source>
        <p:output port="result">
            <p:pipe port="result" step="store"/>
        </p:output>
        <p:store name="store">
            <p:with-option name="href" select="document-uri(.)"/>
        </p:store>
    </p:for-each>

</p:declare-step>

Таким образом, в основном p:for-each вместо p:iteration-source, который использует secondary порт вывода результата из шага p:xslt, а затем внутри просто использует document-uri(.) для получения URI результата. Все это требует xpath-version="2.0".

Каким-то образом oXygen 22 не запускает код, но выдает ошибку отказа в доступе, похоже, он настроен на запись вторичных документов в установочный каталог oXygen, который при обычном Windows настройки безопасности не разрешены и не являются тем местом, где вам нужны файлы результатов; Чтобы исправить эту проблему, я настроил XPro c так, чтобы вход XML использовался в качестве источника ввода для всего сценария XPro c, затем на шаге p:xslt я могу использовать функцию p:base-uri, чтобы установить output-base-uri для XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xpath-version="2.0"
    xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">
    <p:input port="source">
        <p:document href="toc.xml"/>
    </p:input>

    <p:output port="result" primary="true" sequence="true">
        <p:pipe port="result" step="secondary-storage"/>
    </p:output>

    <p:xslt name="xslt-pagelist" version="2.0">
        <p:with-option name="output-base-uri" select="p:base-uri()"/>
        <p:input port="stylesheet">
            <p:document href="page-list.xsl"/>
        </p:input>
        <p:input port="parameters">
            <p:empty/>
        </p:input>
    </p:xslt>

    <p:store href="toc-list.html"/>

    <p:for-each name="secondary-storage">
        <p:iteration-source select=".">
            <p:pipe port="secondary" step="xslt-pagelist"/>
        </p:iteration-source>
        <p:output port="result">
            <p:pipe port="result" step="store"/>
        </p:output>
        <p:store name="store">
            <p:with-option name="href" select="document-uri(.)"/>
        </p:store>
    </p:for-each>

</p:declare-step>

Таким образом, Cala bash из командной строки и внутри oXygen ведут себя одинаково, записывая результаты в тот же каталог, откуда поступает источник ввода.

...