使用变量的值作为新变量的名称

时间:2011-10-25 10:51:34

标签: xslt

我想动态地格式化变量的名称(借助其他变量/参数),然后使用它。在下面的代码中,我尝试使用变量 cur 的值作为变量的名称。但是它不起作用

<!-- xml -->
<root>
  <subroot param='1'/>
  <subroot param='2'/>
</root>

<!-- xslt -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match='/'>

<xsl:variable name='var1'>Tom</xsl:variable>
<xsl:variable name='var2'>Simone</xsl:variable>

<xsl:for-each select='/root/subroot'>
  <xsl:value-of select='@param'/>

  <xsl:variable name='cur'>var<xsl:value-of select='@param'/></xsl:variable>

  <input value='{${$cur}}'/>

</xsl:for-each>

root found
</xsl:template>

</xsl:stylesheet>

必须有结果:

<input value='Tom'/>
<input value='Simone'/>

有关如何使其正常工作的任何建议吗?非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xml:space="default">
  <xsl:variable name='var1'>Tom</xsl:variable>
  <xsl:variable name='var2'>Simone</xsl:variable>

  <xsl:template match='/'>
    <root>
    <xsl:for-each select='/root/subroot'>
      <xsl:variable name='cur' select='@param'/>
      <xsl:variable name="curVar" select="document('')/*/xsl:variable[@name= concat('var', $cur)]"/>

      <input value='{$curVar}'/>
    </xsl:for-each>
    </root>
  </xsl:template>

</xsl:stylesheet>

这应该可以解决问题。

输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <input value="Tom"/>
  <input value="Simone"/>
</root>

答案 1 :(得分:1)

  <input value='{${$cur}}'/>

这是XSLT(1.0,2.0和3.0)所有当前和已知的未来版本中的非法语法。

而且你不需要这样的能力。

只需使用

<input value="{$vmyVar[position() = $cur]}"/>

完整转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:params>
   <p>Tom</p>
   <p>Simone</p>
 </my:params>

 <xsl:variable name="vmyVar" select=
      "document('')/*/my:params/*"/>

  <xsl:template match='/'>
    <root>
     <xsl:for-each select='/root/subroot'>
      <xsl:variable name='cur' select='@param'/>

      <input value="{$vmyVar[position() = $cur]}"/>
     </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<root>
 <subroot param="2"/>
 <subroot param="1"/>
</root>

产生了想要的正确结果

<root>
   <input value="Simone"/>
   <input value="Tom"/>
</root>