Node- sets are returned by location-path expressions. Location paths consist of location steps. Each location step contains an axis and a node test separated by a double colon. That is, a location step looks like this:
axis
::node test
The axis specifies in which direction from the context node the processor searches for nodes. The node test specifies which nodes along that axis are selected. These are some location steps with different axes and node tests:
child::set descendant-or-self::node( ) ancestor-or-self::* attribute::xlink:href
Each location step may be suffixed with predicates enclosed in square brackets that further winnow the node-set. For example:
child::set[position( )=2] descendant-or-self::node( )[.='Eunice'] ancestor-or-self::*[position( )=2][.="Celeste"] attribute::xlink:href[starts-with(., 'http')]
Each individual location step is itself a relative location path. The context node against which the relative location path is evaluated is established by some means external to XPath—for example, by the current matched node in an XSLT template.
Location steps can be combined by separating them with forward slashes. Each step in the resulting location path sets the context node (or nodes) for the next path in the step. For example:
ancestor-or-self::*/child::*[position( )=1] child::document/child::set[position( )=2]/following-sibling::* descendant::node( )[.='Eunice']/attribute::ID
An absolute location path is formed by prefixing a forward slash to a relative location path. This sets the context node for the first step in the location path to the root of the document. For example, these are all absolute location paths:
/descendant::ship/ancestor-or-self::*/child::*[position( )=1] /child::document/child::set[position( )=2]/following-sibling::* /descendant::node( )[.='Eunice']/attribute::ID
Multiple location paths can be combined with the union
operator (|
) to form an expression
that selects a node-set containing all the nodes identified by any of
the location paths. For example, this expression selects a node-set
containing all the set
children of
the context node, all the vector
descendants of the context node, all ancestor
elements of the context node, and
all attributes
of the context node
named href
:
child::set | descendant::vector | ancestor::* | attribute::href
An abbreviated syntax is available for particularly common location steps. In this syntax, five axes may use this shorthand:
Using the abbreviated syntax, the previous examples can be rewritten in the following manner:
set .//. ancestor-or-self::* @xlink:href set[position( )=2] .//.[.='Eunice'] ancestor-or-self::*[position( )=2][.="Celeste"] @xlink:href[starts-with('http')] ancestor-or-self::*/*[position( )=1] document/set[position( )=2]/following-sibling::* .//.[.='Eunice']/@ID //ship/ancestor-or-self::*/*[position( )=1] /document/set[position( )=2]/following-sibling::* /descendant::node( )[.='Eunice']/@ID set | ./*//vector | ancestor::* | @href
Not all location steps can be rewritten using the abbreviated
syntax. In particular, only the child
, self
, attribute
, descendant-or-self
, and parent
axes can be abbreviated. The
remaining axes must be spelled out in full.
Each XPath location step moves along an axis from a
context node. The context node is a particular root,
element, attribute, comment, processing-instruction, namespace, or
text node in the XML document. (In practice, it's almost always an
element node or the root node.) The context node may be a node
selected by the previous location step in the location path, or it
may be determined by extra-XPath rules, such as which node is
matched by an xsl:template
element.
However the context node is determined, it has some relationship to every other node in the document. The various axes divide the document into different overlapping sets, depending on their relationship to the context node. There are exactly 13 axes you can use in an XPath location step:
child
All children of the context node. Only root and element nodes have children. Attribute and namespace nodes are not children of any node, although they do have parent nodes.
descendant
All nodes contained inside the context node—that
is, a child node, a child of a child node, a child of a child
of a child node, and so on. Only root and element nodes have
descendants. Like the child
axis, the descendant
axis
never contains attribute or namespace nodes.
descendant-or-self
Any descendant of the context node or the
context node itself. //
is
an abbreviation for /descendant-or-self::node(
)/
.
parent
The element or root node that immediately
contains the context node. Only the root node does not have a
parent node. ..
is an
abbreviation for parent::node(
)
.
ancestor
The root node and all element nodes that contain the context node. The root node itself has no ancestors.
ancestor-or-self
All ancestors of the context node, as well as the node itself.
following-sibling
All nodes that follow the end of the context node and have the same parent node. Attribute and namespace nodes do not have siblings.
preceding-sibling
All nodes that precede the start of the context node and have the same parent node. Attribute and namespace nodes do not have siblings.
following
All nodes that begin after the context node ends, except for attribute nodes and namespace nodes; that is, all nodes after the context node except descendants.
preceding
All nodes that end before the context node begins, except for attribute nodes and namespace nodes; that is, all nodes before the context node except ancestors.
attribute
All attributes of the context node; the axis is
empty if the context node is not an element node. This axis
does not contain xmlns
and
xmlns
:prefix
attributes. @
name
is an abbreviation for
attribute:
:name
.
namespace
All namespaces in scope (not merely declared) on the context node; this axis is empty if the context node is not an element node.
self
The context node itself. A single period (.) is
an abbreviation for self::node(
)
.
Each location step has at least an axis and a node test.
The node test further refines the nodes selected by the location
step. In an unabbreviated location step, a double colon (:
:) separates the axis from the node test.
There are seven kinds of node tests:
name
An XML name matches all elements with the same name.
However, along the attribute
axis it matches all
attributes with the same name instead; along the namespace
axis it matches all
namespaces with that prefix. As usual, if the element or
attribute name is prefixed, only the URI to which the prefix
is mapped matters, not the prefix itself. Unprefixed names
always match nodes in no namespace, never names in the default
namespace.
prefix
:*
Along most axes, this node test matches all element
nodes whose namespace URIs are the same as the namespace URI
to which this prefix is mapped, regardless of name. However,
along the attribute
axis,
this node test matches all attribute nodes whose namespace
URIs are the same as the namespace URI to which this prefix is
mapped.
comment( )
text( )
This matches all text nodes. Each text node is a maximum contiguous run of text between other types of nodes.
processing-instruction(
)
processing-instruction(
'target
')
With no arguments, this node test selects all processing instructions. With a single string argument, it selects all processing instructions that have the specified target.
node( )
This node test selects all nodes, regardless of type: attribute, namespace, element, text, comment, processing instruction, and root.
*
This test normally selects all element nodes,
regardless of name. However, if the axis is the attribute
axis, then it selects all
attribute nodes. If the axis is the namespace
axis, then it selects all
namespace nodes.