Я пытаюсь преобразовать XSLT 1.0 с использованием Perl. Я использую solution, указанный здесь как мой сценарий.Переменная недоступна из одного файла xsl в другой
Мой входной файл 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 (скажем, файл А и файл B), в котором определены переменные и шаблоны.
файл А считывает узел из входного 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
затем доступ выполнять некоторые другие операции в файл В, как показано ниже
<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? Это полностью квалифицированный путь? –
@StefanHegny .. да, указанный путь - это полностью квалифицированный путь. «OTHER_File» может не всегда присутствовать. Интересно, почему преобразование в java отлично работает в этом случае. – Recker
ваше название вопроса предлагает что-то «из одного файла xslt в другое», есть ли два xslts, как они «связаны»? –