我想在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
答案 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')))"/>