如何在xslt中使用group by

时间:2010-02-25 12:31:57

标签: xslt group-by

我有一个拥有如此多元素的xml,其中大部分包含属性..对于某些属性值是相同的,所以我需要对它们进行分组并生成diff xml。 I / p Ex:

<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 Ex:           有可能得到吗?提前谢谢......

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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