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