<xsl:value-of select="$MyVar"/>
有效,但
<xsl:value-of select="MyDataPfath/$MyVar"/>
不工作。
我的代码有什么问题?
<xsl:value-of select="$MyVar"/>
有效,但
<xsl:value-of select="MyDataPfath/$MyVar"/>
不工作。
我的代码有什么问题?
从外观上看,您要实现的是“动态评估”。默认情况下,XSLT 不支持动态评估 XPath,因此您需要使用扩展函数。
根据您的 XSLT 处理器,您可能希望查看 EXSLT 扩展。特别是http://www.exslt.org/dyn/index.html上的动态模块。这将允许做这样的事情
<xsl:value-of select="dyn:evaluate('MyDataPfath/$MyVar')"/>
但是,在您的情况下,也许 $MyVar 只包含一个元素名称。在这种情况下,您可以将您的命令更改为以下,这将在没有任何扩展功能的情况下工作
<xsl:value-of select="MyDataPfath/*[local-name() = $MyVar]"/>
您的代码没有失败,它完全按照规范所说的去做。这与您希望/想象的不同。
您的希望/想象是基于对 XPath 中变量性质的基本误解。XPath 变量不是宏。它们不能通过文本替换起作用;它们代表价值观。如果变量 $E 包含字符串“X”,则MyPath/$E
表示与 相同MyPath/"X"
,这在 XPath 1.0 中是非法的,并且在 XPath 2.0 中返回的字符串“X”实例与 MyPath 中的节点一样多。
你可能打算MyPath/*[name()=$E]
无法通过在 . 它不会识别正确的路径。假设 $MyVar 的值为“Hi”。因此它将表示为“MyDataPfath/“Hi””,这是您要从 XML 中检索的无效路径。要消除此限制,您可以使用 name() 或 local-name() 函数,可按如下方式使用:或
从外观上看,您要实现的是“动态评估”。默认情况下,XSLT 不支持动态评估 XPath,因此您需要使用扩展函数。
根据您的 XSLT 处理器,您可能希望查看 EXSLT 扩展。特别是http://www.exslt.org/dyn/index.html上的动态模块。这将允许做这样的事情
<xsl:value-of select="dyn:evaluate('MyDataPfath/$MyVar')"/>
但是,在您的情况下,也许 $MyVar 只包含一个元素名称。在这种情况下,您可以将您的命令更改为以下,这将在没有任何扩展功能的情况下工作
<xsl:value-of select="MyDataPfath/*[local-name() = $MyVar]"/>