2012-01-16 62 views
0

我認爲我能解決的每個新問題都證明了我不能。 因此,使用以下XML我想知道有多少個不同的節點有不同的@num屬性。也許更容易理解看希望的輸出。xslt1.0(firefox):計數具有不同值的節點,muenchian分組?

初始XML代碼

<data> 
    <prot seq="AAA"> 
     <node num="2">1345</node> 
     <node num="2">11245</node> 
     <node num="2">112w45</node> 
     <node num="7">88885</node> 
    </prot> 
    <prot seq="BBB"> 
     <node num="2">678</node> 
     <node num="2">456</node> 
     <node num="7">4w56</node> 
     <node num="7">6666</node> 
    </prot> 
    <prot seq="CCC"> 
     <node num="2">111</node> 
     <node num="2">222</node> 
     <node num="2">22w2</node> 
     <node num="7">333</node> 
     <node num="10">3433</node> 
    </prot> 
</data> 

而且願意輸出,使其表達不同的「民」 S究竟有多少

<root> 
<num>2</num> 
<num>7</num> 
<num>10</num> 
</root> 

我想這是可以做到(因爲它似乎永遠是這樣)與muenchian分組。我只是看不到它。

謝謝!

回答

1

我是Meunchian的新手。這裏是我的解決方案:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:key name="dupes" match="node" use="@num"/> 
    <xsl:template match="/"> 
    <root> 
     <xsl:apply-templates select="//node[generate-id() = 
      generate-id(key('dupes', @num)[1])]"/> 
    </root> 
    </xsl:template> 

    <xsl:template match="node"> 
    <num val="{.}"> 
     <xsl:value-of select="@num"/> 
    </num> 
    </xsl:template> 
</xsl:stylesheet> 

當我跑我這跟在xsltproc:

~ zacharyyoung$ xsltproc so.xsl so.xml 
<?xml version="1.0"?> 
<root> 
    <num val="1345">2</num> 
    <num val="88885">7</num> 
    <num val="3433">10</num> 
</root> 

我加入了val="{.}"位顯示哪個節點正在從關鍵組使用。如果我們改變...key('dupes', @num)[1]......key('dupes', @num)[last()]...我們可以看到這裏的區別:

<root> 
    <num val="22w2">2</num> 
    <num val="333">7</num> 
    <num val="3433">10</num> 
</root> 

對於每個組相應值節點(2,7,10,等...),每個組中的last()節點被選擇,與上例中的第一個[1]相比。

我希望這會有所幫助。

+0

是的,就是這樣。我擁有同樣的關鍵組合,但之後我迷失了。感謝您點亮它! :) – Gerard 2012-01-16 23:48:46