xsl-list
[Top] [All Lists]

Re: [xsl] grouping and counting of elements

2007-04-21 09:34:27
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>

When the above stylesheet is applied to XML:

<All_Results>
 <Result>
    <Name>John</Name>
    <Country>UK</Country>
    <!-- other upto 100 elements -->
    <Color>Red</Color>
 </Result>
 <Result>
    <Name>John</Name>
    <Country>US</Country>
    <!-- other upto 100 elements -->
    <Color>Green</Color>
 </Result>
 <Result>
    <Name>Thomas</Name>
    <Country>Estonia</Country>
    <!-- other upto 100 elements -->
    <Color>
    </Color>
 </Result>
 <Result>
    <Name>
    </Name>
    <Country>UK</Country>
    <!-- other upto 100 elements -->
    <Color>Red</Color>
 </Result>
</All_Results>

The output produced is:

<?xml version="1.0" encoding="UTF-8"?>
<Totals>
  <Name>
     <Tag value="John" count="2"/>
     <Tag value="Thomas" count="1"/>
  </Name>
  <Country>
     <Tag value="UK" count="2"/>
     <Tag value="US" count="1"/>
     <Tag value="Estonia" count="1"/>
  </Country>
  <Color>
     <Tag value="Red" count="2"/>
     <Tag value="Green" count="1"/>
  </Color>
</Totals>

On 4/20/07, Leonid Lyublinski <llyublin(_at_)gmail(_dot_)com> wrote:
Hi experts,
I have seen similar questions to mine, yet didn't find a good mach.
Please point to the right thread if exists.
I have a source Xml:


<All_Results>
  <Result>
     <Name>John</Name>
     <Country>UK</Country>
<!-- other upto 100 elements -->
     <Color>Red</Color>
  </Result>
  <Result>
     <Name>John</Name>
     <Country>US</Country>
<!-- other upto 100 elements -->
     <Color>Green</Color>
  </Result>
  <Result>
     <Name>Thomas</Name>
     <Country>Estonia</Country>
<!-- other upto 100 elements -->
     <Color>
     </Color>
  </Result>
  <Result>
     <Name>
     </Name>
     <Country>UK</Country>
<!-- other upto 100 elements -->
     <Color>Red</Color>
  </Result>
</All_Results>

Each <Result> has the same list of sub-elements, some might not have a
text value

I want to aggregate and get something like this:

<Totals>
  <Name>
     <Tag value="John" count="2" />
     <Tag value="Thomas" count="1" />
  </Name>
  <Country>
     <Tag value="UK" count="2" />
     <Tag value="US" count="1" />
     <Tag value="Estonia" count="1" />
  </Country>
  <Color>
     <Tag value="Red" count="2" />
     <Tag value="Green" count="1" />
  </Color>
<!-- other elements grouped by element name, sorted by total of
element values-->
</Totals>

Please advice.
Thanks,
Leonid


--
Regards,
Mukul Gandhi

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>