This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Using position()
- To: Steve Kuntz <SKuntz at CooperVision dot com>
- Subject: Re: [xsl] Using position()
- From: Jeni Tennison <jeni at jenitennison dot com>
- Date: Wed, 7 Nov 2001 18:35:13 +0000
- CC: "'XSL-List at lists dot mulberrytech dot com'" <XSL-List at lists dot mulberrytech dot com>
- Organization: Jeni Tennison Consulting Ltd
- References: <2AE5402428A3EF4F87077DD242BFB6A1C63A23@raptors.coopervision.com>
- Reply-To: xsl-list at lists dot mulberrytech dot com
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