【问题标题】:Xslt: <xsl:value-of select="MyPath/$MyVariable" failedXslt: <xsl:value-of select="MyPath/$MyVariable" 失败
【发布时间】:2012-06-26 06:10:52
【问题描述】:
<xsl:value-of select="$MyVar"/>

有效但

<xsl:value-of select="MyDataPfath/$MyVar"/>

不工作。

我的代码有什么问题?

【问题讨论】:

  • 您能分享您的 XML 架构/示例吗?你确定你的节点名是MyDataPfath
  • $MyVar 存储什么 - 大概是节点的名称?
  • 对不起,我是新手。当然,我必须解释一下上下文。
  • 我有一个带有&lt;foo&gt;&lt;bar&gt;&lt;value1&gt;Hello 1&lt;/value1&gt;&lt;value2&gt;Hello abc&lt;/value2&gt;&lt;/bar&gt;&lt;/foo&gt;的xml源文件
  • 我有另一种类型的 xml 源文件,其中封装了 第一个子 foo 中的第一个值第一个 foo 中的第二个 @Utkanos 值第二个子 foo 中的第一个值第二个子 foo 中的第二个值 foo>` 是的,“foo”出现在第一个层次结构和第二个层次结构中。

标签: xslt value-of


【解决方案1】:

从外观上看,您想要实现的是“动态评估”。 XSLT 默认不支持 XPath 的动态求值,所以需要使用扩展函数。

根据您的 XSLT 处理器,您可能需要查看 EXSLT 扩展。特别是http://www.exslt.org/dyn/index.htmldynamic 模块。这将允许做这样的事情

<xsl:value-of select="dyn:evaluate('MyDataPfath/$MyVar')"/> 

但是,在您的情况下,$MyVar 可能只包含一个元素名称。在这种情况下,您可以将您的命令更改为以下命令,这将在没有任何扩展功能的情况下工作

<xsl:value-of select="MyDataPfath/*[local-name() = $MyVar]"/>

【讨论】:

    【解决方案2】:

    您的代码没有失败,它完全按照规范的要求执行。这与您希望/想象的不同。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多