10

我想在 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>

变量“输入”的可能值是“名称”或“地址”。输出变量的 select 语句应该有一个基于输入变量值的动态变量名。我不想使用 xsl:choose。我想动态选择值。请给我一个解决方案。

谢谢,迪努

4

2 回答 2

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>
于 2010-12-12T04:43:09.973 回答
0

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

<xsl:variable name="output" 
              select="concat(substring($Name, 1 div ($input = 'Name')),
                             substring($Address, 1 div ($input = 'Address')))"/>
于 2010-12-12T23:26:59.117 回答