мы можем использовать динамическое имя переменной в операторе выбора в xslt? - PullRequest
9 голосов
/ 12 декабря 2010

Я хотел использовать динамическое имя переменной в операторе выбора в xslt.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
    <xsl:variable name="input" select="input/message" />
    <xsl:variable name="Name" select="'MyName'" />
    <xsl:variable name="Address" select="MyAddress" />
    <xsl:variable name="output" select="concat('$','$input')" />  <!-- This is not working -->
     <output>
       <xsl:value-of select="$output" />
     </output>
</xsl:template>

Возможные значения для переменной "input" - это "Name" или "Address",Оператор select выходной переменной должен иметь имя динамической переменной, основанное на значении входной переменной.Я не хочу использовать xsl: выбирать.Я хотел выбрать значение динамически.Пожалуйста, предоставьте мне решение.

Спасибо, дхину

Ответы [ 2 ]

12 голосов
/ 12 декабря 2010

XSLT 1.0 и XSLT 2.0 не имеют динамической оценки.

Решение вашей проблемы :

Это преобразование :

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output method="text"/>

 <my:values>
  <name>MyName</name>
  <address>MyAdress</address>
 </my:values>

 <xsl:template match="/">
  <xsl:variable name="vSelector"
   select="input/message"/>
  <xsl:value-of select=
   "document('')/*/my:values/*[name()=$vSelector]"/>
 </xsl:template>
</xsl:stylesheet>

при применении к следующему документу XML :

<input>
  <message>address</message>
</input>

дает желаемый, правильный результат :

MyAdress

когда то же преобразование применяется к этому документу XML :

<input>
  <message>name</message>
</input>

снова желаемый, правильный результат выдается :

MyName

Наконец : Если вы не хотите использовать функцию document(), но хотите использовать функцию расширения xxx:node-set(), тогда это решение (очень похожее) - то, что вам нужно, где вы можете обратиться к документации вашего XSLT-процессора для точного пространства имен расширения:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" >
 <xsl:output method="text"/>

 <xsl:variable name="vValues">
  <name>MyName</name>
  <address>MyAdress</address>
 </xsl:variable>

 <xsl:template match="/">
  <xsl:variable name="vSelector"
   select="input/message"/>
  <xsl:value-of select=
   "ext:node-set($vValues)/*[name()=$vSelector]"/>
 </xsl:template>
</xsl:stylesheet>
0 голосов
/ 13 декабря 2010

Кроме хорошего ответа @ Dimitre, для этого конкретного случая (выходное строковое значение) вы также можете использовать:

<xsl:variable name="output" 
              select="concat(substring($Name, 1 div ($input = 'Name')),
                             substring($Address, 1 div ($input = 'Address')))"/>
...