xsl-list
[Top] [All Lists]

Re: Simple Question concerning [last()]

2003-02-08 12:44:03

<Stefan(_dot_)Wachter(_at_)gmx(_dot_)de> wrote in message
news:13789(_dot_)1044728370(_at_)www28(_dot_)gmx(_dot_)net(_dot_)(_dot_)(_dot_)
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



<Prev in Thread] Current Thread [Next in Thread>