2016-01-07 48 views
0

我有一个定义的XSLT密钥。我需要从for-each循环内访问密钥,其中该循环正在处理一个不在密钥定义范围内的节点集。XSLT“密钥”的作用域(根节点,上下文)元素

片段,在那里我已经打上两行,其中一个作品和其中一个不会:

<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引擎。 (我想不出一个合理的方法来为此提供一个完整的工作示例,我也不确定正确的术语,如“范围” - 也许如果我知道正确的术语我会是能已经找到我的答案。如果问题是不够清楚,请让我知道,我会尽力将其修改成更好的状态。)

+0

尝试减少这是一个完整的,有效的XSLT最小的例子,并提供一个XML文件进行匹配,以显示预期的输出。 –

+0

嗨,吉姆。昨天我无法做到这一点,但在迈克尔的回答下面我现在明白了这个问题,并能够做到这一点。 $ outOfScopeNodeSet确实有一个与正在处理的文档不同的根,因为使用了msxsl:node-set(),它深深埋藏着数百行XSL。 –

回答

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> 
+0

嗨迈克尔。 $ outOfScopeNodeSet确实有一个与正在处理的文档不同的根,因为使用了msxsl:node-set(),它深深埋藏着数百行XSL。感谢您的解释和建议的解决方案。 –