Re: [xsl] grouping and counting of elements

Subject: Re: [xsl] grouping and counting of elements
From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx>
Date: Sat, 21 Apr 2007 18:36:16 +0100
On 4/21/07, Mukul Gandhi <gandhi.mukul@xxxxxxxxx> wrote:
Hi Leonid,
  Below is a XSLT 2.0 solution for this:

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

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

  <xsl:template match="/">
    <Totals>
      <xsl:for-each select="All_Results/Result[1]/*">
        <xsl:variable name="name" select="name()" />
        <xsl:element name="{$name}">
          <xsl:for-each-group select="../../Result/*[name() = $name]"
group-by=".">
            <xsl:if test="not(normalize-space(.) = '')">
              <Tag value="{.}" count="{count(current-group())}" />
            </xsl:if>
          </xsl:for-each-group>
        </xsl:element>
      </xsl:for-each>
    </Totals>
  </xsl:template>

</xsl:stylesheet>

Heres another way which doesn't rely on all elements being present in the first <Result>:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:template match="/">
	<Totals>
		<xsl:for-each-group
select="/All_Results/Result/*[normalize-space()]" group-by="name()">
			<xsl:element name="{current-grouping-key()}">
				<xsl:for-each-group select="current-group()" group-by=".">
					<Tag value="{current-grouping-key()}" count="{count(current-group())}"/>
				</xsl:for-each-group>
			</xsl:element>
		</xsl:for-each-group>
	</Totals>
</xsl:template>
</xsl:stylesheet>

cheers
andrew

Current Thread