Я пытаюсь выполнить преобразование 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
.
$OTHERTHE_File
иdocument($OTHERTHE_File)/bsg/msg
, они обязательно будут переданы и существуют? Может быть, проблема в пути поиска $ OTHERTHE_File? Это полноценный путь? - person Stefan Hegny   schedule 24.06.2016OTHER_File
может не всегда присутствовать. Интересно, почему в таком случае преобразование в java отлично работает. - person Recker   schedule 24.06.2016