2011-03-16 96 views
1

目標XSL唯一值密鑰

(XSLT 1.0)。我的目標是獲取一組元素S並生成另一個集合T,其中T包含S中的獨特元素並儘可能高效地完成此操作。 (注意:我不必創建一個包含該集合的變量,或者類似的東西,我只需要循環遍歷唯一的元素)。

例輸入和關鍵

<!-- My actual input consists of a bunch of <Result> elements --> 
<AllMyResults> 
<Result> 
<someElement>value</state> 
<otherElement>value 2</state> 
<subject>Get unique subjects!</state> 
</Result> 
</AllMyResults> 

<xsl:key name="SubjectKey" match="AllMyResults/Result" use="subject"/> 

我覺得上面的作品,但是當我去使用我的鑰匙,這是令人難以置信的慢。以下是我如何使用我的密鑰的代碼。

<xsl:for-each select="Result[count(. | key('SubjectKey', subject)[1]) = 1]"> 
    <xsl:sort select="subject" /> 
      <!-- Do something with the unique subject value --> 
    <xsl:value-of select="subject" /> 
</xsl:for-each> 

附加信息

我相信我這樣做不對,因爲它大大減慢我的XSL。作爲一些額外的信息,上面顯示的代碼位於與我的主XSL文件不同的XSL文件中。在主XSL中,我調用了一個模板,其中包含上面顯示的xsl:key和for-each。此模板的輸入是一個包含我的節點集的xsl:param(類似於上面顯示的示例輸入)。

+0

好問題,+1。查看我的答案以獲得推薦的解決方案 – 2011-03-16 14:36:09

+0

性能應該根據一些參考來衡量,在這種情況下不存在。它比什麼慢?它比沒有執行區分的樣式錶慢嗎? – 2011-03-16 17:38:34

回答

0

嘗試用

count(. | key('SubjectKey', subject)[1]) = 1 

generate-id() = generate-id(key('SubjectKey', subject)[1]) 

在一些XSLT處理器後者要快得多。

+0

謝謝迪米特雷。我在這個論壇的另一個主題中注意到,你使用了類似於key(​​'SubjectKey','。')...的東西...是否使用了與使用確切名稱「subject」相同的點字符? – KyleM 2011-03-16 14:44:39

+0

@KyleM:不,'''表示當前節點(在這種情況下,當前節點的字符串值用作鍵值),'subject'表示所有名爲'subject'的子元素 - 並且在此如果任何'subject'子項的字符串值被用作鍵值。 – 2011-03-16 15:54:41

1

我看不出給出信息的原因,爲什麼代碼應該慢。如果緩慢是所有XSLT處理器上發生的事情,或者它是一個特殊情況,可能值得一看。