【问题标题】:Scope (root node, context) of XSLT "key" ElementXSLT“key”元素的范围(根节点、上下文)
【发布时间】:2016-04-12 06:44:29
【问题描述】:

我定义了一个 XSLT 键。我需要从 for-each 循环中访问密钥,其中该循环正在处理一个节点集,该节点集超出了定义密钥的范围。

片段,我在其中标记了两行,一行有效,另一行无效:

<xsl:value-of select="key('name', 'use')"/> <!-- works -->
<xsl:for-each select="$outOfScopeNodeSet">
    <xsl:value-of select="key('name', 'use')"/> <!-- does not work -->
</xsl:for-each>

有没有办法从 for-each 循环中访问密钥?

XSLT 1.0,msxsl 引擎。

(我想不出一种合理的方式来为此提供一个完整的工作示例。我也不确定正确的术语,例如“范围” - 如果我知道正确的术语,我可能会能够已经找到我的答案。如果问题不够清楚,请告诉我,我会尝试将其编辑成更好的形式。)

【问题讨论】:

  • 尝试将其简化为完整、有效的 XSLT 的最小示例,并提供一个 XML 文件进行匹配,显示预期的输出。
  • 嗨,吉姆。昨天我无法做到这一点,但在迈克尔下面的回答之后,我现在明白了这个问题并且能够做到。 $outOfScopeNodeSet 确实有一个与正在处理的文档不同的根,因为使用了深埋在数百行 XSL 中的 msxsl:node-set()。

标签: xslt xslt-1.0 msxsl


【解决方案1】:

在 XSLT 1.0 中,键不能跨文档工作。似乎您的 $outOfScopeNodeSet 包含一个节点集,其根节点与正在处理的 XML 文档的根节点不同(可能由 exsl:node-set() 函数创建?) - 而密钥应该从已处理的 XML 文档。

要解决这个问题,需要在调用key()函数之前将上下文返回到处理后的XML文档中,例如:

<xsl:variable name="root" select="/" />
<xsl:for-each select="$outOfScopeNodeSet">
    <xsl:variable name="use" select="some-value" />
    <xsl:for-each select="$root">
        <xsl:value-of select="key('name', $use)"/>
    </xsl:for-each>
</xsl:for-each>

【讨论】:

  • 嗨,迈克尔。 $outOfScopeNodeSet 确实有一个根,它与正在处理的文档的根不同,因为使用了深埋在数百行 XSL 中的 msxsl:node-set()。感谢您的解释和建议的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2010-11-04
  • 2021-10-31
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多