xsl-list
[Top] [All Lists]

RE: XSLT sort

2004-05-20 13:54:29
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(_dot_)olsson(_at_)soderhamn(_dot_)mail(_dot_)telia(_dot_)com]
>

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


--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--




<Prev in Thread] Current Thread [Next in Thread>