2013-01-18 89 views
1

有關this的問題,是否可以在xsl:key中使用變量?我想這樣做水木清華這樣的:是否可以在xsl:key指令中使用變量?

<xsl:key name="ChargesKey" match="$ChargesForDisplay/charge" use="Name"/> 

我使用XSLT 1.0與ASP.Net

+1

不在這樣的匹配表達式中,沒有。您能否顯示變量的定義以及您正在使用的輸入XML的示例,可能有另一種方法可以在不直接引用變量的情況下確定要匹配的元素,例如,如果變量是'// foo [@class ='x]',那麼你可以匹配'charge [../@ class ='x']'。 –

回答

1

我相信我可以有把握地認爲你指的是動態生成的節點集變量(而不是到那些從源DOM中選擇的數據),是的,可以對動態生成的節點集變量的內容執行密鑰匹配(如我爲this question演示的那樣)。

假設你有一個這樣的變量:

<xsl:variable name="ChargesForDisplay"> 
<charge> 
    <Name>Name1</Name> 
</charge> 
<charge> 
    <Name>Name2</Name> 
</charge> 
<charge> 
    <Name>Name1</Name> 
</charge> 
<charge> 
    <Name>Name3</Name> 
</charge> 
</xsl:variable> 

你會這樣定義鍵:

<xsl:key name="ChargesKey" match="charge" use="Name"/> 

然後你就可以應用它是這樣的:

<xsl:template match="/"> 
     <xsl:apply-templates select="msxsl:node-set($ChargesForDisplay)" /> 
    </xsl:template> 

    <xsl:template 
    match="charge[generate-id(.)=generate-id(key('ChargesKey',Name)[1])]"> 
    <xsl:variable name="matchingItems" select="key('ChargesKey', Name)" /> 
    ... 
    </xsl:template> 

當然,如果變量包含來自源XML DOM的節點選擇,那麼它就是一樣的方法,除非你不需要使用msxsl:node-set()

我懷疑在源XML文檔或多個動態生成的節點集變量中存在的節點名上的鍵可能會導致分組產生意外的結果(因爲key()函數將定位節點變量和源文檔)。出於這個原因,我建議在節點上定義只存在於特定變量和其他地方的密鑰。

1

xsl:key的match屬性必須是有效模式,$ x/y不是有效模式。所以,答案是否定的。現在告訴我們你想要達到的目標,我們可以幫助你實現目標。 (JLRishe做出了一些瘋狂的猜測,他/她稱之爲「瘋狂假設」,這可能是對的;但我不知道猜測來自哪裏)。

+0

所有的猜測都來自我以前的帖子。我在我的正式消息中指定了一個鏈接 –

相關問題