|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: Calculating cumulative values - another call for h
Andrew, When I run your stylesheet against my input I get a Saxon error where it is creating attribute "y3". The error is shown below. The string "n" is the value of the attribute "id" for the set element in the input. Is it because "xs:integer(parent::set/@id - 1)" precludes the use of non-numerical id values? Simon ****************************** C:\Program Files\Saxon\bin>transform.exe -t -s testFunc.xml -o testFuncOutAndrew 2.xml andrew2.xsl Saxon 8.9N from Saxonica .NET 2.0.50727.832 on Microsoft Windows NT 5.1.2600 Service Pack 2 Stylesheet compilation time: 797 milliseconds Processing file:/C:/Program%20Files/Saxon/bin/testFunc.xml Building tree for file:///C:/Program Files/Saxon/bin/testFunc.xml using class ne t.sf.saxon.tinytree.TinyBuilder Tree built in 15 milliseconds Tree size: 73 nodes, 97 characters, 60 attributes Validation error on line 21 of file:///C:/Program Files/Saxon/bin/andrew2.xsl: Cannot convert string "n" to a double Transformation failed: Run-time errors were reported ****************************** -----Original Message----- From: Andrew Welch Sent: August 29, 2007 9:03 AM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: Calculating cumulative values - another call for help 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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Cast Your Vote
We need your help – Vote for DataDirect XML Products!
Winners and finalists announced at SOA World Conference in November. Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|







