[Home] [By Thread] [By Date] [Recent Entries]
On 2/3/07, Andrew Welch <andrew.j.welch@xxxxxxxxx> wrote:
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="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>
|

Cart



