Re: [xsl] Using position()

Subject: Re: [xsl] Using position()
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Wed, 7 Nov 2001 18:35:13 +0000
Hi Steve,

> While looping through an xsl:for-each select, I can do this: <xsl:if
> test="./@t_orno = '100000006'"> to compare an the value of the
> t_orno attribute to a static string, and I can do this: <xsl:if
> test="./@t_orno = //row[1]/@t_orno"> to compare it to the value of
> the attribute in row 1...but what I really want to do is to compare
> the attribute value to the attribute value immediately preceding it.
> I thought this would work: <xsl:if test="./@t_orno =
> //row[position()-1]/@t_orno"> but it doesn't.
 
That's precisely what the preceding-sibling:: axis is for. Try the
test:

  @t_orno = preceding-sibling::row[1]/@t_orno

The reason that //row[position()-1]/@t_orno doesn't work is that the
position() function gives the position of the *context* node, which
within that predicate is the position of the row element amongst its
siblings. Since it's a numeric predicate, it's the equivalent of using
the path //row[position() = position() - 1]/@t_orno. You could store
the position() of the current row in a variable and then test against
that, but using the preceding-sibling:: axis is likely to be quicker.

By the way, there's never any need to put ./ at the beginning of a
location path, because location paths are always resolved from the
context node (.) anyway.

I hope that helps,

Jeni

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


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


Current Thread