Re: [xsl] basic xsl question

Subject: Re: [xsl] basic xsl question
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Tue, 21 Jan 2003 12:16:24 +0000
Hi Matts,

> Stylesheet like this:
>
>   <xsl:for-each select="root/orders/order">
>     <!-- the person is '/root/order/person_id' in root/persons/person/id
> -->
>     <xsl:value-of select="root/persons/person[id=person_id]/name" />
>   </xsl:for-each>
>
> The problem i'am having is related to the value-of row. How do i
> write that so it works?

You have two problems. First, you need to add a / before "root" in the
xsl:value-of, because you want to search from the top of the document,
not from the order that you're currently in. Second, as you've
identified, you need to refer to the person_id of the order; you can
do this by getting the *current* node (the order element that you're
processing) using the current() function, as follows:

  <xsl:for-each select="root/orders/order">
    <xsl:value-of
      select="/root/persons/person[id = current()/person_id]/name" />
  </xsl:for-each>

or by assigning the person_id to a variable and then referring to
that:

  <xsl:for-each select="root/orders/order">
    <xsl:variable name="id" select="person_id" />
    <xsl:value-of select="/root/persons/person[id = $id]/name" />
  </xsl:for-each>

Alternatively, you could use keys here. Index each person by their id
using an xsl:key declaration:

<xsl:key name="persons" match="person" use="id" />

and then retrieve them using the key() function:

  <xsl:for-each select="root/orders/order">
    <xsl:value-of select="key('persons', person_id)/name" />
  </xsl:for-each>

This is likely to be quicker if you have lots of orders and/or lots of
person elements.
  
Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread