Re: [xsl] Calculating cumulative values - another call for help

Subject: Re: [xsl] Calculating cumulative values - another call for help
From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx>
Date: Wed, 29 Aug 2007 17:03:04 +0100
Here's my attempt that uses a key and does it in one pass:

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:xs="http://www.w3.org/2001/XMLSchema";
  exclude-result-prefixes="xs">

<xsl:key name="point-by-set-id-and-x" match="point"
  use="concat(parent::set/@id,'-',@x)"/>

<xsl:template match="@*|node()">
	<xsl:copy>
		<xsl:apply-templates select="@*|node()"/>
	</xsl:copy>
</xsl:template>

<xsl:template match="point">
	<xsl:copy>
		<xsl:copy-of select="@*"/>
		<xsl:attribute name="y2">
    	<xsl:value-of select="sum(@y1|preceding-sibling::point[@x =
current()/@x]/@y1)"/>
  	</xsl:attribute>
  	<xsl:attribute name="y3">
   		<xsl:value-of select="sum((@y1, preceding-sibling::point[@x =
current()/@x]/@y1)) + sum(for $x in 1 to xs:integer(parent::set/@id - 1)
return key('point-by-set-id-and-x',
  concat($x, '-', current()/@x))/@y1)"/>
  	</xsl:attribute>
	</xsl:copy>
</xsl:template>

</xsl:stylesheet>

It could be re-written in pure 1.0 if you replaced the "for $x in to
xs:integer(parent::set/@id - 1)" with a recursive named template... if
you could be bothered :)

cheers
andrew
-- 
http://andrewjwelch.com

Current Thread