Subject: RE: [xsl] Calculating cumulative values From: "Simon Shutter" <simon@xxxxxxxxxxx> Date: Sat, 3 Feb 2007 22:08:37 -0800 |
I think I may go with 'conventional' solution provided by Andrew, because it is natively supported by .Net 2 and my data sets are relatively small and tranformed pretty quickly. I will look more into FXSL for the longer term. If I needed to sort the data before I determined the cumulative numbers, how do I ensure this happens before aggregating the data? Thanks, Simon -----Original Message----- From: Dimitre Novatchev [mailto:dnovatchev@xxxxxxxxx] Sent: February 3, 2007 4:48 PM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: [xsl] Calculating cumulative values On 2/3/07, Simon Shutter <simon@xxxxxxxxxxx> wrote: > Thanks, Dimitre. > > Two questions - > > a) Will this work with .Net 2.0? No, the two XSLT processors that come as part of .NET 2.0 (the classes XslTransform and XslCompiledTransform) only support XSLT 1.0. However, in a .NET environment one can use Saxon.NET, which is a port of Saxon 8.x and implements XSLT 2.0. > > b) What are the external files : func-scanlDVC.xsl and func-Operators.xsl? They are part of the FXSL library. The latest version of FXSL can be checked out from the CVS of the project at: http://sourceforge.net/cvs/?group_id=53841 One can learn more about FXSL from the presentations made at the Extreme Markup Languages Conference in Montreal 2006 (FXSL 2 -- for XSLT 2.0, and FXSL 1 -- for XSLT 1.0) here: http://www.idealliance.org/papers/extreme/proceedings/xslfo-pdf/2006/Novatch ev01/EML2006Novatchev01.pdf and here: http://www.idealliance.org/papers/extreme/proceedings/xslfo-pdf/2003/Novatch ev01/EML2003Novatchev01.pdf Other papers about different important features of FXSL can be found at the home page of FXSL: http://fxsl.sf.net -- 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 > > 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, Mukul Gandhi |
Re: [xsl] Calculating cumulative va, Dimitre Novatchev | Date | Re: [xsl] Calculating cumulative va, Mukul Gandhi |
Month |