Subject: Re: optimization of complex XPath
From: Graydon <graydon@xxxxxxxxx>
Date: Fri, 19 Nov 2010 05:19:36 -0500
|
On Fri, Nov 19, 2010 at 09:25:50AM +0100, Wolfgang Laun scripsit:
> The O(n^2) is due to iterating over a list (for) and then iterating
> over the document tree to find //num/@cite.
>
> The following stylesheet should do it better,using xsl:key:
I am reluctant to approach the problem with xsl:key because I have about
90,000 individual files in a complex directory structure and I would
need a key over all of them, rather than each of them.
Since far as I know -- and happy to be wrong! -- I can't declare a key
over a collection, so this approach would require concatenating all of
the files together. Which is certainly doable but also inherently
sluggish.
> <?xml version="1.0"?>
> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:output method="text"/>
> <xsl:strip-space elements="*"/>
> <xsl:key name="citekey" match="num" use="@cite"/>
> <xsl:template match="link">
> <xsl:value-of select="(key('citekey',@cite),'ok',concat(@cite,' is
> missing'))[2]"/><xsl:text>
> </xsl:text>
> </xsl:template>
> </xsl:stylesheet>
>
> I have tested it with a very primitive XML only:
>
> <doc>
> <foo>
> <num area="decisions" cite="1"/>
> <bar>
> <link area="decisions" cite="1"/>
> <link area="decisions" cite="2"/>
> </bar>
> </foo>
> </doc>
Thank you!
-- Graydon
|