Переменная недоступна для перехода от одного файла xsl к другому

Я пытаюсь выполнить преобразование XSLT 1.0 с помощью Perl. Я использую указанное здесь решение в качестве сценария.

Мой входной XML-файл выглядит примерно так.

<?xml version="1.0" encoding="UTF-8" ?>
    <bsg>
          <msg>
               <entry key="testingString">This is a test.</entry>
               <!-- <trs> This is me, trs!!! </trs> -->
            </msg>
    </bsg>

Атрибут trs является необязательным, что означает, что он не всегда присутствует во всех других entry узлах. Запись может иметь необязательное свойство tslate, которое может быть true или false, т.е. входной XML-файл может иметь что-то вроде

<entry key="Doctor" tslate="false">Physician.</entry>

К сценарию Perl я добавляю файл xslt, который импортирует два других файла xslt (например, файл A и файл B), в которых определены переменные и шаблоны.

Файл A считывает узел из входного XML-файла и выполняет следующую операцию

<xsl:param name="isOTHERFILEavailable"/>    
  <xsl:variable name="tvariables">
    <xsl:choose>
      <xsl:when test="$isOTHERFILEavailable = 'true'">
        <xsl:copy-of select="document($OTHERTHE_File)/bsg/msg"/>
      </xsl:when>
    </xsl:choose>
  </xsl:variable>

isOTHERFILEavailable - строковый параметр, переданный из файла Perl, который проверяет, существует ли OTHERFILE или нет.

Затем к этому tvariables обращаются для выполнения некоторых других операций в файле B, как показано ниже.

<xsl:template match="msg">
<xsl:variable name="trsExists">
            <xsl:for-each select="entry">
                <xsl:variable name="current_key" select="@key"/>
                <xsl:variable name="trsMatch" select="$tvariables/msg/entry[@key = $current_key]"/>
                <xsl:choose>
                    <xsl:when test="$trsMatch and normalize-space($trsMatch/text) = normalize-space(.) and (not(@tslate) or @tslate = true())">
                        <xsl:copy>
                            <xsl:copy-of select="$trsMatch/@key|$trsMatch/tvariables/text()|@context"/>                     
                        </xsl:copy>
                    </xsl:when>
                </xsl:choose>
            </xsl:for-each>        
</xsl:variable>
</xsl:template>

Моя проблема в том, что когда я дохожу до этой линии,

<xsl:variable name="trsMatch" select="$tvariables/msg/entry[@key = $current_key]"/>

Ошибки Perl выглядят следующим образом

Invalid type runtime error: file B.xslt line # element variable Failed to evaluate the expression of variable 'tvariables'

Я упускаю что-то очевидное?

P.S => Все работает нормально при запуске того же преобразования из Java с использованием XSLT 2.0 (Saxon) и даже когда tvariables не определен, то есть когда isOTHERFILEavailable равно false.


person Recker    schedule 24.06.2016    source источник
comment
как насчет $OTHERTHE_File и document($OTHERTHE_File)/bsg/msg, они обязательно будут переданы и существуют? Может быть, проблема в пути поиска $ OTHERTHE_File? Это полноценный путь?   -  person Stefan Hegny    schedule 24.06.2016
comment
@StefanHegny .. да, указанный путь является полностью определенным путем. OTHER_File может не всегда присутствовать. Интересно, почему в таком случае преобразование в java отлично работает.   -  person Recker    schedule 24.06.2016
comment
заголовок вашего вопроса предлагает что-то от одного файла xslt к другому, задействованы ли два xslt, как они связаны?   -  person Stefan Hegny    schedule 24.06.2016


Ответы (1)


$ tvariable - это xml-фрагмент.

Мне кажется вероятным, что Perl использует процессор XSL 1.0. В этом случае ваша проблема заключается в том, что $ tvariable необходимо преобразовать из фрагмента в набор узлов, прежде чем вы сможете его использовать. XSL 2 обрабатывает фрагменты, как и следовало ожидать, поэтому код работает на Saxon. К счастью, большинство процессоров XSL 1.0 (а вообще?) Предоставляют поддержку фрагментов с функцией расширения. Вам нужно будет проверить свою документацию для получения подробной информации. Ваш оператор выбора будет выглядеть примерно так:

 select="node-set($tvariables)/msg/entry[@key = $current_key]"

Посетите http://www.xml.com/pub/a/2003/07/16/nodeset.html для получения дополнительной информации о функциях набора узлов.

person Phil Blackburn    schedule 24.06.2016