Subject: Re: [xsl] improving performance in creating ids From: "Pieter Lamers pieter.lamers@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Tue, 23 Apr 2019 22:02:13 -0000 |
B B B B B B B B B <xsl:number level="any" from="*[@id]"/> incorrectly renumbers also if there are siblings with an @id.
Best to all, Pieter
Hey Pieter,
If performance were the issue, I might try factoring out the ID labeling into a completely separate pass, in order (for example) to implement it as a sibling traversal, passing parameters forward to increment the ID values. (If your numbering is fancy, for example scoping the increment to the element type as well as the ancestor, you might have to pass a map forward.) I think that ought to be pretty fast, plus it separates this logic from the other logic of the XSLT. It's essentially like treating the XSLT engine like an overpowered SAX parser. (Not that I would know how to make one of those.)
But this is only if xsl:number wasn't doing it, after I tried something like what Martin H shows with plain old templates.
<xsl:variable name="ilk" select="local-name()"/> <xsl:value-of select="$ilk || '-'"/> <xsl:number level="any" from="*[@id]" count="*[local-name() eq $ilk]"/>
-- untested --
Cheers, Wendell
On Tue, Apr 23, 2019 at 10:57 AM Martin Honnen martin.honnen@xxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:On 23.04.2019 16:28, Pieter Lamers pieter.lamers@xxxxxxxxxxxx wrote:
Thanks for your quick reply. the node identity comparison helped quite a bit, although I am still around a minute for a full book of ids. I am not sure how xsl:number would help here, and what kind of performance win it would give over count(). I tried something with a nested transformation, but what should I feed it?
<xsl:number select="*[last()]"/> works (given a set of preceding nodes) but it is slightly slower than a count() in the xquery. Maybe I should be using xsl:number differently?
It is difficult for me to suggest that without knowing the XML input structure and whether you want to generate that id based on a count or numbering only for certain nodes or some particular element type. In general if I wanted to delegate counting to xsl:number similar to your function I would define a template in a mode for that e.g.
<xsl:template match="*" mode="number"> <xsl:number level="any" from="*[@id]"/> </xsl:template>
and then, where you need that number, you would use e.g.
<xsl:apply-templates select="." mode="number"/>
Both the template or the or the select of the apply-templates can of course be adapted to more particular needs.
As for being more efficient that using count, that then depends on the implementation but I would think there is some optimization to be expected in an XSLT processor for xsl:number.
-- Pieter Lamers John Benjamins Publishing Company Postal Address: P.O. Box 36224, 1020 ME AMSTERDAM, The Netherlands Visiting Address: Klaprozenweg 75G, 1033 NN AMSTERDAM, The Netherlands Warehouse: Kelvinstraat 11-13, 1446 TK PURMEREND, The Netherlands tel: +31 20 630 4747 web: www.benjamins.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] improving performance in , Wendell Piez wapiez@ | Thread | Re: [xsl] improving performance in , Wendell Piez wapiez@ |
Re: [xsl] improving performance in , Wendell Piez wapiez@ | Date | Re: [xsl] Dynamically determining l, Larry Hayashi lhtree |
Month |