如何在XSLT中基于Muenchian分组统计各组元素数量?
XML分组并统计每组元素数量
原始输入XML
<?xml version="1.0" encoding="utf-8"?> <items> <element name="Name1" value="Text1"/> <element name="Name1" value="Text3"/> <element name="Name1" value="Text4"/> <element name="Name3" value="Text5"/> <element name="Name3" value="Text8"/> </items>
需求说明
需要将元素按name属性分组,同时统计每组的元素数量,输出指定格式的XML。
期望输出XML
<?xml version="1.0"?> <goods> <group name="Name1" sum="3"> <item>Text1</item> <item>Text3</item> <item>Text4</item> </group> <group name="Name3" sum="2"> <item>Text5</item> <item>Text8</item> </group> </goods>
现有XSLT代码(已实现Muenchian分组)
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:key name="PC" match="element" use="@name"/> <xsl:template match="items"> <goods> <xsl:apply-templates select="element[generate-id(.) = generate-id(key('PC',@name))]"/> </goods> </xsl:template> <xsl:template match="element"> <group name="{@name}"> <xsl:for-each select="key('PC',@name)"> <item> <xsl:value-of select="@value"/> </item> </xsl:for-each> </group> </xsl:template> </xsl:stylesheet>
解决方案:添加分组数量统计
只需修改<group>标签,新增sum属性,通过count(key('PC',@name))获取当前分组的元素总数即可。修改后的完整XSLT代码如下:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:key name="PC" match="element" use="@name"/> <xsl:template match="items"> <goods> <xsl:apply-templates select="element[generate-id(.) = generate-id(key('PC',@name))]"/> </goods> </xsl:template> <xsl:template match="element"> <!-- 新增sum属性,用count统计当前分组的元素数量 --> <group name="{@name}" sum="{count(key('PC',@name))}"> <xsl:for-each select="key('PC',@name)"> <item> <xsl:value-of select="@value"/> </item> </xsl:for-each> </group> </xsl:template> </xsl:stylesheet>
说明
count(key('PC',@name))会返回当前name属性对应的所有分组元素的个数,直接将该值赋值给sum属性就能完成统计需求。
内容的提问来源于stack exchange,提问作者MagicWorld
相关产品推荐
相关产品推荐

