如何在xslt元素上应用GROUPBY
我需要根据某些属性对值进行分组并填充它 下面提到的是i/p xml,如果您看到有4行用于用户和id 2,那么4个分区是相同的,即HR 在生成实际o/p时,我需要按部门分组。。。有什么帮助吗 I/p XML如何在xslt元素上应用GROUPBY,xslt,grouping,Xslt,Grouping,我需要根据某些属性对值进行分组并填充它 下面提到的是i/p xml,如果您看到有4行用于用户和id 2,那么4个分区是相同的,即HR 在生成实际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" Divisi
<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>
2.
基础知识
5.
PQR
3.
XYZ
4.
LMN
使用
....
查看此示例:在XSLT1.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>
在XSLT2.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>
我不喜欢添加这样的元素,这就是我要做的。这很好用。它提供您需要的输出。试试看 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>
XSLT1.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>
XSLT2.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>
2.
基础知识
5.
PQR
3.
xyz
4.
LMN
如果可以的话,我会给出+10,很好的例子:-)在XSLT 2.0的例子中,如果不使用key()函数,那么它的用途是什么?@Paul,声明key没有任何意义,我测试了没有它的代码。它看起来像是作者在将XSLT1.0版本修改为2.0版本时忘记删除的XSLT1.0版本的剩余部分。我删除了声明和固定的打字错误Users->User以及Division属性的选择。XSLT2是否需要键
?
<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>