我们可以在xslt的select语句中使用动态变量名吗?

时间:2010-12-12 04:19:51

标签: xslt xslt-1.0

我想在xslt中的select语句中使用动态变量名。

<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:choose。我想动态选择值。 请给我一个解决方案。

谢谢, dhinu

2 个答案:

答案 0 :(得分:12)

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()扩展功能,那么此解决方案(看起来非常相似)是你想要什么,你可以在哪里查阅你的XSLTprocessor文档,了解扩展的确切命名空间:

<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>

答案 1 :(得分:0)

除了@ Dimitre的好答案,对于这个特殊情况(输出字符串值),你也可以使用:

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