Subject: Re: [xsl] Calculating cumulative values From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> Date: Sat, 3 Feb 2007 16:48:14 -0800 |
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?
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:
Other papers about different important features of FXSL can be found at the home page of FXSL:
-- 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, Simon Shutter | Thread | RE: [xsl] Calculating cumulative va, Simon Shutter |
RE: [xsl] Calculating cumulative va, Simon Shutter | Date | RE: [xsl] Calculating cumulative va, Simon Shutter |
Month |