2016-01-07 49 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。感謝您的解釋和建議的解決方案。 –