Subject: RE: [xsl] Calculating cumulative values From: "Simon Shutter" <simon@xxxxxxxxxxx> Date: Sat, 3 Feb 2007 16:13:59 -0800 |
Thanks, Dimitre. Two questions - a) Will this work with .Net 2.0? b) What are the external files : func-scanlDVC.xsl and func-Operators.xsl? Simon -----Original Message----- From: Dimitre Novatchev [mailto:dnovatchev@xxxxxxxxx] Sent: February 3, 2007 2:50 PM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: [xsl] Calculating cumulative values On 2/3/07, Andrew Welch <andrew.j.welch@xxxxxxxxx> wrote: > > You can just use XPath here, no need for recursion: > > <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:copy> > </xsl:template> However evaluating this XPath expression repeatedly is O(N^2) and will probably be slow for long lists. Here is a solution, using the FXSL function f:scanl1() This transformation: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="http://fxsl.sf.net/" exclude-result-prefixes="f" > <xsl:import href="../f/func-scanlDVC.xsl"/> <xsl:import href="../f/func-Operators.xsl"/> <!-- To be applied on testFunc-scanlDVC3.xml --> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="set"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:for-each-group select="point" group-by="@x"> <xsl:for-each select="f:scanl1(f:add(), current-group()/@y1)"> <point x="{current-group()[1]/@x}" y="{.}"/> </xsl:for-each> </xsl:for-each-group> </xsl:copy> </xsl:template> </xsl:stylesheet> When applied against the originally provided xml document: <root id="theroot"> <set id="1"> <point x="1" y1="2" /> <point x="1" y1="3" /> <point x="1" y1="0" /> <point x="1" y1="2" /> <point x="1" y1="2" /> <point x="2" y1="3" /> <point x="2" y1="0" /> <point x="2" y1="2" /> <point x="3" y1="2" /> <point x="3" y1="3" /> <point x="3" y1="1" /> <point x="3" y1="2" /> <point x="3" y1="2" /> </set> <set id="2"> <point x="1" y1="2" /> <point x="1" y1="3" /> <point x="1" y1="0" /> <point x="1" y1="2" /> <point x="2" y1="2" /> <point x="3" y1="2" /> <point x="3" y1="2" /> <point x="3" y1="2" /> </set> <set id="n"> <point x="1" y1="2" /> <point x="1" y1="3" /> <point x="1" y1="2" /> <point x="2" y1="3" /> <point x="2" y1="0" /> <point x="2" y1="2" /> <point x="3" y1="3" /> </set> </root> produces the wanted result: <root id="theroot"> <set id="1"> <point x="1" y="2"/> <point x="1" y="5"/> <point x="1" y="5"/> <point x="1" y="7"/> <point x="1" y="9"/> <point x="2" y="3"/> <point x="2" y="3"/> <point x="2" y="5"/> <point x="3" y="2"/> <point x="3" y="5"/> <point x="3" y="6"/> <point x="3" y="8"/> <point x="3" y="10"/> </set> <set id="2"> <point x="1" y="2"/> <point x="1" y="5"/> <point x="1" y="5"/> <point x="1" y="7"/> <point x="2" y="2"/> <point x="3" y="2"/> <point x="3" y="4"/> <point x="3" y="6"/> </set> <set id="n"> <point x="1" y="2"/> <point x="1" y="5"/> <point x="1" y="7"/> <point x="2" y="3"/> <point x="2" y="3"/> <point x="2" y="5"/> <point x="3" y="3"/> </set> </root> -- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Calculating cumulative va, Dimitre Novatchev | Thread | Re: [xsl] Calculating cumulative va, Dimitre Novatchev |
Re: [xsl] Calculating cumulative va, Dimitre Novatchev | Date | Re: [xsl] Calculating cumulative va, Dimitre Novatchev |
Month |