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(_at_)wendellpiez(_dot_)com
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> 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(_at_)wendellpiez(_dot_)com> 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(_at_)wendellpiez(_dot_)com> 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(_dot_)honnen(_at_)gmx(_dot_)de
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:
On 23.04.2019 16:28, Pieter Lamers
pieter(_dot_)lamers(_at_)benjamins(_dot_)nl 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...
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--