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()
, тогда это решение (очень похожее) - то, что вам нужно, где вы можете обратиться к документации вашего XSLT-процессора для точного пространства имен расширения:
<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>