2012-11-20 80 views
1

由於XML代碼XSLT1,Muenchian分組的,列出了分組節點在foreach循環

<z> 
<f hit="1"> 
<g>hola1</g> 
</f> 
<f hit="2"> 
<g>hola2</g> 
</f> 
<f hit="3"> 
<g>hola1</g> 
</f> 
</z> 

我想用xslt1有XML輸出

<z> 
hola1 
hola2 
</z> 

。然後,一個簡單的解決辦法是Muenchian分組的

<xsl:key name="thisone" match="/z/f/g" use="." /> 
<z> 
<xsl:for-each select="/z/f[generate-id(g)=generate-id(key('thisone',g)[1])]"> 
<xsl:value-of select="g" /> 
</xsl:for-each> 
</z> 

但是,我申請這一個大的數據集時,系統(火狐)一直想永遠。我認爲這是由於真的很大的數據集。但是,「g」的不同值的數量真的很低。

我的問題是:有沒有辦法做Muenchian分組的的節點for-each循環?像

<xsl:for-each select="nodes_of_key('thisone')"> 

這將避免比較所有的「g」節點的所有值,這將永遠需要?

感謝

回答

0

一個並不需要任何<xsl:for-each>指令來解決這個問題(這個指令,最好避免):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kFByG" match="f" use="g"/> 

<xsl:template match="/*"> 
    <z> 
     <xsl:apply-templates/> 
     <xsl:text>&#xA;</xsl:text> 
    </z> 
</xsl:template> 

<xsl:template match="f[generate-id()=generate-id(key('kFByG',g)[1])]"> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:value-of select="g"/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用:

<z> 
    <f hit="1"> 
     <g>hola1</g> 
    </f> 
    <f hit="2"> 
     <g>hola2</g> 
    </f> 
    <f hit="3"> 
     <g>hola1</g> 
    </f> 
</z> 

想要的,正確的結果產生:

<z> 
hola1 
hola2 
</z> 
+0

是的,但使用相同的比較。我的問題是,當我有一個小文件進行處理時,這是工作,但是當這個文件更大時,瀏覽器會一直處理。 所以我的問題,如果有什麼辦法可以避免比較所有的節點,只是通過被「存儲」在XSL的那些去:鍵(如果這樣的事情是可能的) – Gerard

+0

@Gerard,這是一個密鑰 - 與比較一個值與所有其他值(O(N^2))相比,它的數量級更快(接近O(1))。 –

+0

@Gerard,經歷「所有節點」是線性的 - 它確實很快,甚至可能達到幾百MB大小的亞秒。 –