RE: [xsl] Counting nodes efficiently

Subject: RE: [xsl] Counting nodes efficiently
From: "Andrew Welch" <AWelch@xxxxxxxxxxxxxxx>
Date: Thu, 19 Feb 2004 08:59:17 -0000
> Greetings.
> 
> I've been using Jeni's method from the XSLT FAQ to assign 
> unique id's to 
> nodes. In order to speed things up, can anyone think of a way 
> that I could 
> store the running totals for the different nodes, rather than 
> having to 
> call the count() function repeatedly? A generalized method 
> would obviously 
> be the best, so that it could be applied to any arbitrary set 
> of nodes, 
> but I don't know if this is even possible.
> 
> <xsl:template match="*">
>    <xsl:variable name="name" select="name()" />
>    <xsl:element name="{name()}">
>      <xsl:attribute name="id">
>        <xsl:value-of select="concat($name, '-',
>        count(preceding::*[name()= $name]) +
>        count(ancestor::*[name()= $name]))" />
>      </xsl:attribute>
>      <xsl:apply-templates />
>    </xsl:element>
> </xsl:template>

3 ways:

1.  Create a node-set by selecting all the elements you wish to count
and numbering them using position().  You can then query into this
node-set using the generate-id() function to get the correct number for
the element you're processing.  This only requies one pass of the data
so its quite efficient.

2.  Write a SAX Filter in java that numbers the elements on their way
into the transform.  You can then select this number as if it was
already in the data.

3.  If you are using saxon, you can substring the value returned from
generate-id() after the 'e', as the generated id's take form 'dxxeyy'
where d is the document number and e is the element number.

cheers
andrew

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread