RE: [xsl] for-each and summing based on group

Subject: RE: [xsl] for-each and summing based on group
From: dmitrik@xxxxxxxxxxxxxx
Date: Wed, 5 Jan 2005 12:37:04 -0500 (EST)
This for-each correctly displays the sum on a non-grouping level.
Customer is displayed for each Trade, but there can be many trades with the
same Customer.  When changing the xsl from 1.0 to 2.0 there were errors.
Is it simpler to do that, or use Muenchian grouping for the Customer?


<xsl:for-each select="Trade">

<xsl:sort select="Customer"/> 

<tr class="r{position() mod 2}">

<td><xsl:value-of select="Customer"/> </td>

<td><xsl:value-of select="TradeId"/><xsl:text/></td>

<td><xsl:value-of select="Type"/><xsl:text/></td>

<td align="right">
<xsl:value-of select="format-number(sum(Step
   [concat(substring(MinFlowDate,7),substring(MinFlowDate,1,2),substring(MinFlowDate,4,2))&gt;=
concat(substring($global,7),substring($global,1,2),substring($global,4,2))]
   [concat(substring(MinFlowDate,7),substring(MinFlowDate,1,2),substring(MinFlowDate,4,2))&lt;
concat(substring($global,7)+3,substring($global,1,2),substring($global,4,2))]
   /StepCharge)+ sum(Step
   [concat(substring(MinFlowDate,7),substring(MinFlowDate,1,2),substring(MinFlowDate,4,2))&gt;=
concat(substring($global,7),substring($global,1,2),substring($global,4,2))]
   [concat(substring(MinFlowDate,7),substring(MinFlowDate,1,2),substring(MinFlowDate,4,2))&lt;
concat(substring($global,7)+3,substring($global,1,2),substring($global,4,2))]
   /StepSetoff)  , '###,###,##0')"/>
</td>

</xsl:for-each>

Thanks,
Dmitri

-----Original Message-----
From: Michael Kay <mike@xxxxxxxxxxxx>
Sent: Jan 5, 2005 4:50 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] for-each and summing based on group

First read up about standard grouping techniques such as Muenchian grouping
at http://www.jenitennison.com/xslt/grouping

Computing a subtotal for each group is then a minor variant of the
technique: instead of merely iterating over the items in the group using
xsl:for-each, you can assign the node-set comprising the group to a
variable, and then sum over that using the sum() function.

Like all grouping problems, it's much easier in 2.0:

<xsl:for-each-group select="rows" group-by="columnA">
  <xsl:apply-templates select="current-group()"/>
  <subtotal><xsl:value-of select="sum(current-group()/columnB)"/></subtotal>
</xsl:for-each-group>

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: dsk [mailto:dmitrik@xxxxxxxxxxxxxx] 
> Sent: 05 January 2005 04:09
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] for-each and summing based on group
> 
> 
> within a for-each there might be various sets of values which 
> produce the 
> following grid, where val is equal to a number
> 
> a  val val val
> a  val val val
> a  val val val
> b  val val val
> b  val val val
> c  val val val
> c  val val val
> 
> what is the best way to insert a sum line for the first
> column a, one for b, and one for c.
> 
> is a nested for each needed? or checking to see if the 
> following value is 
> not equal to the preceding, then then summing?
> 
> thanks,
> Dmitri
> 
> ---
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.802 / Virus Database: 545 - Release Date: 11/26/2004

Current Thread