Re: [xsl] improving performance in creating ids

Subject: Re: [xsl] improving performance in creating ids
From: "Wendell Piez wapiez@xxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 23 Apr 2019 21:47:29 -0000
Okay this is my next shot --

<xsl:value-of select="ancestor::*[exists(@id)][1]/@id || '-' || local-name() ||
count( key('elems-by-name',local-name(),ancestor::*[exists(@id)][1])[current()
>> .] ) + 1"/>

but after having done that I'd probably go back to xsl:number.

Partly since it's probably as fast, but mainly because declarative syntax rules.

(Note: still untested. Use at your own risk!)

Cheers, Wendell


On Tue, Apr 23, 2019 at 5:40 PM Wendell Piez wapiez@xxxxxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Oops, hit button too soon -- you'll see the error there.
>
> I leave scoping the correct count as an exercise, but it's in there
> somewhere! :-)
>
> Cheers, Wendell
>
> On Tue, Apr 23, 2019 at 5:39 PM Wendell Piez <wapiez@xxxxxxxxxxxxxxx> wrote:
> >
> > Hi again,
> >
> > Also note if we had a key we would need no variable --
> >
> > <xsl:value-of select="local-name() || '-'"/>
> > <xsl:number level="any" from="*[@id]" count="key('elem-by-name',local-name())"/>
> >
> > which suggests we could also use the third argument of key() ...
> >
> > <xsl:value-of select="local-name() || '-' ||
> > count(key('elems-by-name',local-name(),ancestor::*[exists(@id)][1]))"/>
> >
> > still not tested -- but ought to work, syntax errors aside --
> >
> > Cheers, Wendell
> >
> > On Tue, Apr 23, 2019 at 5:31 PM Wendell Piez <wapiez@xxxxxxxxxxxxxxx> wrote:
> > >
> > > 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.
> > > >
> > >
> > >
> > >
> > > --
> > > ...Wendell Piez... ...wendell -at- nist -dot- gov...
> > > ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org...
> > > ...github.com/wendellpiez... ...gitlab.coko.foundation/wendell...
> >
> >
> >
> > --
> > ...Wendell Piez... ...wendell -at- nist -dot- gov...
> > ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org...
> > ...github.com/wendellpiez... ...gitlab.coko.foundation/wendell...
>
>
>
> --
> ...Wendell Piez... ...wendell -at- nist -dot- gov...
> ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org...
> ...github.com/wendellpiez... ...gitlab.coko.foundation/wendell...
> 



-- 
...Wendell Piez... ...wendell -at- nist -dot- gov...
...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org...
...github.com/wendellpiez... ...gitlab.coko.foundation/wendell...

Current Thread