how to apply group by on xslt elements

grouping, xslt

Solution

In XSLT 1.0, using Muenchian grouping.

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

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

    <xsl:key name="division" match="User" use="@Division" />

    <xsl:template match="Users">
        <AllUsers>
            <xsl:apply-templates select="User[generate-id(.)=generate-id(key('division',@Division)[1])]"/>
        </AllUsers>
    </xsl:template>

    <xsl:template match="User">
        <Division value="{@Division}">
            <xsl:for-each select="key('division', @Division)">
                <User>
                    <id><xsl:value-of select="@id" /></id>
                    <name><xsl:value-of select="@name" /></name>
                </User>
            </xsl:for-each>
        </Division>
    </xsl:template>

</xsl:stylesheet>

In XSLT 2.0, use xsl:foreach-group

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

<xsl:template match="Users">
    <AllUsers>
        <xsl:for-each-group select="User" group-by="@Division">
            <Division value="{@Division}">
                <xsl:for-each select="current-group()">
                    <User>
                        <id><xsl:value-of select="@id" /></id>
                        <name><xsl:value-of select="@name" /></name>
                    </User>
                </xsl:for-each>
            </Division>
        </xsl:for-each-group>
    </AllUsers>
</xsl:template>

Problem

I need to group the value based on some attribute and populate it. below mentioned is i/p xml and if you see there are 4 rows for Users and for id 2,4 Division is same i.e. HR while generating actual o/p I need to group by Division ... Any help ??? I/P XML ``` <Users> <User id="2" name="ABC" Division="HR"/> <User id="3" name="xyz" Division="Admin"/> <User id="4" name="LMN" Division="Payroll"/> <User id="5" name="PQR" Division="HR"/> </Users> ``` expected Result: I need to group the values based on Division and populate i.e. ``` <AllUsers> <Division value="HR"> <User> <id>2</id> <name>ABC</name> </User> <User> <id>5</id> <name>PQR</name> </User> </Division> <Division value="ADMIN"> <User> <id>3</id> <name>XYZ</name> </User> </Division> <Division value="Payroll"> <User> <id>4</id> <name>LMN</name> </User> </Division> </AllUsers> ```

Original source