[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Simple Question concerning [last()]


Subject: Re: [xsl] Simple Question concerning [last()]
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Sat, 8 Feb 2003 11:44:03 -0800 (PST)

<Stefan.Wachter@xxxxxx> wrote in message
news:13789.1044728370@xxxxxxxxxxxxxxxx
> Hi all.
> 
> My question is about a [last()] predicate in a simple step. Running 
> the following stylesheet on itself yields unexpected results using 
> Saxon and Xalan.
> 
> I thought the XPath ".//x[last()] should return the last x-Element in
> document order. However, it returns the first one. Changing the 
> selection to ".//x[2] returns nothing at all! Yet, the XPath ".//x" 
> returns all x-Elements and the first x-Element has the position 1 and

> the second 2.
> 
> Is this a bug in the mentioned XSLT processors or have I missed 
> something?

You missed something. According to the XPath spec:

http://www.w3.org/TR/xpath#path-abbrev

"// is short for /descendant-or-self::node()/"

Therefore, the expression:

.//x[last()]

is equivalent to:

./descendant-or-self::node()/child::x[last()]

This returns all "x" descendent elements, which are the last child of
their parent.

In your case all "x" elements are the only (that means the last) child
of their parent. Therefore, all are returned.

Analogously:

.//x[2]

is equivalent to:

./descendant-or-self::node()/child::x[2]

and returns all "x" descendent elements, which are the second child of
their parent.

But there are not two "x" elements which are children of the same
parent!
Therefore, nothing will be returned.


What you probably wanted was:

(.//x)[last()]

and

(.//x)[2]



Hope this helped.


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL


__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com

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



Current Thread
Keywords