我想动态地格式化变量的名称(借助其他变量/参数),然后使用它。在下面的代码中,我尝试使用变量 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'/>
有关如何使其正常工作的任何建议吗?非常感谢您的帮助。
答案 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>