如何在xslt元素上应用group

我需要根据某个属性对值进行分组并填充它。

下面提到的是i / p xml,如果你看到有4行用户和id 2,4分区是相同的,即人力资源

同时生成实际的O / P我需要由分组…任何帮助?

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> 

预期结果:我需要根据分组的值,并填充即

 <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> 

在XSLT 1.0中,使用Muenchian分组。

 <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> 

在XSLT 2.0中,使用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> 

使用

 <xsl:for-each-group select="*" group-by="@Division"> .... </xsl:for-each-group> 

看看这个例子: http : //www.zvon.org/xxl/XSL-Ref/Tutorials/For-Each-Group/feg1.html

我不喜欢添加这样的元素,这是我会做的。 这完美的作品。 它给你所需要的输出。 试试看。

XML

 <?xml version="1.0"?> <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> 

XSLT 1.0

 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:key name="division" match="User" use="@Division" /> <xsl:template match="Users"> <xsl:element name="AllUsers"> <xsl:apply-templates select="User[generate-id(.)=generate-id(key('division',@Division)[1])]" /> </xsl:element> </xsl:template> <xsl:template match="User"> <xsl:element name="Division"> <xsl:attribute name="value"> <xsl:value-of select="@Division" /> </xsl:attribute> <xsl:for-each select="key('division', @Division)"> <xsl:element name="User"> <xsl:element name="id"> <xsl:value-of select="@id" /> </xsl:element> <xsl:element name="name"> <xsl:value-of select="@name" /> </xsl:element> </xsl:element> </xsl:for-each> </xsl:element> </xsl:template> </xsl:stylesheet> 

XSLT 2.0

 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" /> <xsl:key name="division" match="User" use="@Division" /> <xsl:template match="Users"> <xsl:element name="AllUsers"> <xsl:for-each-group select="*" group-by="@Division"> <xsl:element name="Division"> <xsl:attribute name="value"> <xsl:value-of select="@Division" /> </xsl:attribute> <xsl:for-each select="current-group()"> <xsl:element name="User"> <xsl:element name="id"> <xsl:value-of select="@id" /> </xsl:element> <xsl:element name="name"> <xsl:value-of select="@name" /> </xsl:element> </xsl:element> </xsl:for-each> </xsl:element> </xsl:for-each-group> </xsl:element> </xsl:template> </xsl:stylesheet> 

使用任一会给你这个输出

 <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>