Предупреждение: нераспознанный элемент xsl: переменная онлайн работает саксон, но не в Oxygen, почему? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть файл схематора, который выглядит так (как можно проще)

    <sch:pattern id="TDOP_0400">
            <sch:rule context="//tekst:Kop">
                 <xsl:variable name="CONDITION"> 
                        <xsl:value-of select="tekst:Label and tekst:Opschrift and tekst:Nummer"/>
                 </xsl:variable>
            </sch:rule>
    </sch:pattern>

Когда я запускаю его в Oxygen, он работает нормально, но когда я запускаю его из командной строки, я получаю ошибку , Это моя команда командной строки:

$ java -cp ../saxon9.9.1.5/saxon9he.jar net.sf.saxon.Transform -t -s:tpod0400.sch -xsl:../saxon9.9.1.5/iso_svrl_for_xslt2.xsl -o:tpod0400.xsl

Это сообщение об ошибке, я получаю его для каждой xsl: variable-line:

Warning: unrecognized element xsl:variable

Ответы [ 2 ]

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

Добавьте в команду «allow-foreign = true»:

$ java -cp ../saxon9.9.1.5/saxon9he.jar net.sf.saxon.Transform -t -s:tpod0400.sch -xsl:../saxon9.9.1.5/iso_svrl_for_xslt2.xsl -o:tpod0400.xsl allow-foreign=true

«allow-foreign» - это параметр в iso_svrl_for_xslt2.xsl, который задокументирован в таблице стилей следующим образом:

Передача не-Schematron элементов и расширенной разметки в сгенерированную таблицу стилей

xsl:variable не является элементом Schematron и не указывается, если allow-foreign=true.

0 голосов
/ 05 мая 2020

Лучший и самый безопасный способ - отделить sch (schematron) от кода xslt. Держите sch-код внутри правила, и, если вам нужна xslt-функциональность, прервите вызов функции xslt-code, затем верните результат функции обратно в sch-код, и go on с sch- обработка.

Так коротко: Никогда не смешивайте sch и xslt в одном контексте программирования, и вы всегда будете в безопасности.

У меня есть пример, не берите в голову то, что он делает или для чего он , здесь, чтобы продемонстрировать, как разорвать sch-контекст для вызова некоторого xslt-кода, а затем вернуться обратно в sch-контекст:

<sch:pattern id="TPOD_0520">
    <sch:rule context="//tekst:Hoofdstuk/tekst:Titel">
        <sch:let name="APPLICABLE"
            value="$SOORT_REGELING = $OP or $SOORT_REGELING = $OV or $SOORT_REGELING = $WV"/>
        <sch:let name="hoofdstuk" value="string(../tekst:Kop/tekst:Nummer)"/>
        <sch:let name="titel" value="string(tekst:Titel/tekst:Kop/tekst:Nummer)"/>

<!-- Below is the break-out to XSLT, and the value coming from the function is used in the sch-code -->

        <sch:let name="volgorde" value="foo:volgordeTPOD_0520($titel, .)"/>
        <sch:let name="CONDITION" value="string-length($volgorde) = 0"/>
        <sch:assert test="($APPLICABLE and $CONDITION) or not($APPLICABLE)"> 
            TPOD_0520: Als tussen Hoofdstuk en Afdeling Titel voorkomt dan moet de nummering van Afdelingen beginnen met het samengestelde nummer van de Titel waarin de Afdeling voorkomt, gevolgd door een punt. (betreft hoofdstukken, titels, afdelingen):  <xsl:value-of select="$hoofdstuk"/>: <sch:value-of select="$titel"/>: <sch:value-of select="substring($volgorde,1,string-length($volgorde)-2)"/></sch:assert>
    </sch:rule>
</sch:pattern>

<xsl:function name="foo:volgordeTPOD_0520">
    <xsl:param name="titel" as="xs:string"/>
    <xsl:param name="context" as="node()"/>
    <xsl:variable name="volgorde">
        <xsl:for-each select="$context/tekst:Afdeling">
            <xsl:if test="not(string(tekst:Kop/tekst:Nummer)=concat($titel, '.', string(position())))">
                <xsl:value-of select="concat(string(tekst:Kop/tekst:Nummer),', ')"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>
    <xsl:value-of select="$volgorde"/>
</xsl:function>
...