xsl-list
[Top] [All Lists]

RE: Counting nodes efficiently

2004-02-19 01:59:17

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