This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Using position()


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]