2010-02-25 68 views
5

我有一個xml,它有很多元素,大部分都包含屬性..對於某些屬性值是相同的,所以我需要將它們分組並生成diff xml。 I/P例如:如何在xslt中使用group

<TestNode> 
<ABC1 value="10.7" format="$" /> 
<ABC2 value="10.5" format="$" /> 
<ABC3 value="20" format="Rs" /> 
<ABC4 value="50" format="Rs" /> 
<ABC5 value="10.5" format="$" /> 
</TestNode> 

我通過格式需要組的行。 注意:格式不固定...它可能會增長... O/P例: 是有可能得到?在此先感謝...

+0

您使用XSLT 1.0和XSLT 2.0? – 2010-02-25 12:36:23

+0

我使用的是xslt 1.0。在VS 2008中有 是2.0嗎? – Amit 2010-02-25 12:47:03

+0

Microsoft沒有XSLT 2.0實現。 Saxon.NET實現可從www.saxonica.com獲得。 – 2010-02-25 13:12:53

回答

4

在XSLT 2.0,你應該能夠<xsl:for-each-group>current-grouping-key()current-group()

例做到這一點:

<xsl:for-each-group 
    select="TestNode/*" 
    group-by="@format" 
> 
    <group format="{current-grouping-key()}"> 
     <xsl:for-each select="current-group()"> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </group> 
</xsl:for-each-group> 

參見:http://www.w3.org/TR/xslt20/#grouping

+0

xsl:for-each-group上的屬性稱爲「group-by」而不是「groupby」。 爲什麼這 - 爲每個複製組中的每個項目,爲什麼不簡單而不是for-each? – 2010-02-25 13:58:15

+0

馬丁,感謝您指出了拼寫錯誤。我希望我提供的規範鏈接不會被所有抄錄我的建議的人所浪費。至於「for-each」,這個想法是建議如何訪問組中的單個項目。事實上,如果你想要做的只是複製這些項目,那麼是的,的確,你可以只使用一個副本。 – 2010-02-25 14:46:00

5

在XSLT 1.0你會使用Muenchian分組。

定義一個關鍵的「格式」,從中我們可以很容易地選擇給定格式名稱的所有元素。比應用Muenchian分組來查找輸入中的獨特格式。

然後變得簡單。每個格式將應用「*」模板一次,並使用key()獲取該格式的所有條目。

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

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="format" match="TestNode/*" use="@format" /> 

    <xsl:template match="TestNode"> 
     <body> 
      <xsl:apply-templates select="*[generate-id(.)=generate-id(key('format',@format)[1])]"/> 
     </body> 
    </xsl:template> 

    <xsl:template match="*"> 
     <format format="{@format}"> 
      <xsl:copy-of select="key('format', @format)" /> 
     </format> 
    </xsl:template> 

</xsl:stylesheet>