I support a web site which generates content XML that is then translated into web pages using XSLT. I have been asked to create a new stylesheet which will transform the ou
Browsing through the XSLT spec today, I found a note which explains why //
behaves this way:
//
is short for/descendant-or-self::node()/
. For example,//para
is short for/descendant-or-self::node()/child::para
and so will select anypara
element in the document (even apara
element that is a document element will be selected by//para
since the document element node is a child of the root node);div//para
is short fordiv/descendant-or-self::node()/child::para
and so will select allpara
descendants of div children.NOTE: The location path
//para[1]
does not mean the same as the location path/descendant::para[1]
. The latter selects the first descendantpara
element; the former selects all descendantpara
elements that are the firstpara
children of their parents.
In other words, when using //
, the position()
is calculated along the child
axis, not the descendant-or-self
axis. Specifying descendant
or descendant-or-self
allows you to get the first/last n nodes as you'd expect: