RE: [xsl] XSLT sort

Subject: RE: [xsl] XSLT sort
From: Tomas Olsson <tomas.olsson@xxxxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 20 May 2004 22:54:29 +0200
yes, thats what i wanted. Now I tried a solution like this on a document with 8000 lines:

<xsl:key name="name-key" match="Person" use="@enamn" />

<xsl:template match="Katalog">
 <xsl:copy>
  <xsl:variable name="unique-names"
                select="Person[generate-id()=
                  generate-id(key('name-key',@enamn))]/@enamn" />
  <xsl:for-each select="$unique-names">
    <xsl:sort select="." order="ascending" />
    <xsl:apply-templates select="key('name-key',.)" />
  </xsl:for-each>
 </xsl:copy>
</xsl:template>

<xsl:template match="Person">
 <xsl:copy-of select="."/>
</xsl:template>

But I didnt get any better performance. My document is like this:

<Katalog>
<Person fnamn="Orvar" enamn="Olsson" tfn="026-789536">
<Adress adress="Norrav. 34" postnr="50623" postort="Soderhamn">japp</Adress>
<Cv>Har arbetat som konsult hos microsoft sedan barnsben</Cv><Info alder="24"/>
</Person>
<Person fnamn="Orvar" enamn="Orre" tfn="026-782576">
<Adress adress="Sodrav. 34" postnr="50323" postort="Gavle"/>
<Cv>Har arbetat som stadare hos ericsson</Cv><Info alder="24"/>
</Person>
<Person fnamn="Per" enamn="Olsson" tfn="026-789536">
<Adress adress="Norrav. 34" postnr="50623" postort="Soderhamn"/>
<Cv>Sommarjobbat hos prv</Cv><Info alder="24"/>
</Person>
.
.
.
</Katalog>


And I have a lot of elements with the same "enamn" attribute. Is It possible to solve it any other way to get better performance?

/Tomas

At 22:32 2004-05-20 +0200, you wrote:
> -----Original Message-----
> From: Tomas Olsson [mailto:tomas.olsson@xxxxxxxxxxxxxxxxxxxxxxxx]
>

Hi,

> Im trying to get better performance by using keys, I have heard thats
> possible but I dont know how to do.
>

Well, depends on what you want to achieve.

Your initial code:

- applies templates to the Person nodes, sorted on @enamn
- for each Person node, applies templates to the @enamn node
- for each @enamn (one on each Person node), insert a copy of every Person
node with an @enamn equal to the current one

Unfortunately, we can only guess what the initial structure is that you're
trying to improve. My best guess is you want to create a variable containing
all unique @enamn values in the document, and use that to take control over
the template matching, like:

<xsl:key name="name-key" match="Person" use="@enamn" />

<xsl:template match="Katalog">
  <xsl:variable name="unique-names"
                select="Person[generate-id()=
                  generate-id(key('name-key',@enamn))]/@enamn" />
  <xsl:for-each select="$unique-names">
    <xsl:sort select="." order="ascending" />
    <xsl:apply-templates select="key('name-key',.)" />
  </xsl:for-each>
</xsl:template>

In this way, the sorting will only be performed on the group of unique names
instead of on all nodes in the document, which could mean a considerable
improvement in documents as large as you describe.


HTH!


Greetz,

Andreas

Current Thread