2016-06-24 1 views
0

Я пытаюсь преобразовать 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.

+0

Как насчет '$ OTHERTHE_File' и' document ($ OTHERTHE_File)/bsg/msg', они обязательно должны быть переданы и уже существующими? Может быть, это проблема с выбором $ OTHERTHE_File? Это полностью квалифицированный путь? –

+0

@StefanHegny .. да, указанный путь - это полностью квалифицированный путь. «OTHER_File» может не всегда присутствовать. Интересно, почему преобразование в java отлично работает в этом случае. – Recker

+0

ваше название вопроса предлагает что-то «из одного файла xslt в другое», есть ли два xslts, как они «связаны»? –

ответ

1

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

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

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

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

Смежные вопросы