0
<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]"/>
4

3 回答 3

0

您的代码没有失败,它完全按照规范所说的去做。这与您希望/想象的不同。

您的希望/想象是基于对 XPath 中变量性质的基本误解。XPath 变量不是宏。它们不能通过文本替换起作用;它们代表价值观。如果变量 $E 包含字符串“X”,则MyPath/$E表示与 相同MyPath/"X",这在 XPath 1.0 中是非法的,并且在 XPath 2.0 中返回的字符串“X”实例与 MyPath 中的节点一样多。

你可能打算MyPath/*[name()=$E]

于 2012-06-26T08:50:19.903 回答
0

无法通过在 . 它不会识别正确的路径。假设 $MyVar 的值为“Hi”。因此它将表示为“MyDataPfath/“Hi””,这是您要从 XML 中检索的无效路径。要消除此限制,您可以使用 name() 或 local-name() 函数,可按如下方式使用:或

于 2012-06-28T09:28:29.260 回答
0

从外观上看,您要实现的是“动态评估”。默认情况下,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]"/>
于 2012-06-26T08:05:32.510 回答