<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