Re: [xsl] efficient use of key element and function

Subject: Re: [xsl] efficient use of key element and function
From: andrew welch <andrew.j.welch@xxxxxxxxx>
Date: Wed, 7 Sep 2005 09:51:20 +0100
On 9/6/05, Manfred Staudinger <manfred.staudinger@xxxxxxxxx> wrote:
> Hi all,
> Given a rather long list of unique names I want to know for a
> certain name if it is on that list. The stylesheet below does
> this, but is this the best (most efficient) solution? In the most
> common case around 95% of the names will be found.
> - is the key element correct (I have no use for @use)?
> - should I sort the names?
>
> In the real stylesheet the names represent files and are used
> to avoid a file-not-found for doc(). They are retrieved by means
> of collection().
>
> <?xml version="1.0" encoding="UTF-8" ?>
> <xsl:stylesheet version="2.0"
>             xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> <xsl:key name="find" match="*" use="."/>
> <xsl:template match="/">
> <xsl:variable name="Index-alt">
>     <doc>
>         <name>
>             <xsl:text>schmid_hans</xsl:text>
>         </name>
>         <name>
>             <xsl:text>prunauer_katharina</xsl:text>
>         </name>
>         <name>
>             <xsl:text>senkenwald_wolfgang</xsl:text>
>         </name>
>     </doc>
> </xsl:variable>
> <xsl:value-of select="empty(key('find', 'prunauer_regina', $Index-alt))"/>
> <xsl:value-of select="empty(key('find', 'strada_jacopo', $Index-alt))"/>
> </xsl:template>
> </xsl:stylesheet>

Not sure about your key definition:

* matches all elements
. gets all the descedant text nodes and concatenates them together

so

<name>schmid_hans</name>

and

<doc><name>schmid_</name><name>hans</name></doc>

when keyed with 'schmid_hans' would both return an element, but is
probably not want you want.

If might be better to match on text() than on *

cheers
andrew

Current Thread