如何在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>