<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet href="../make-menu.xsl" type="text/xsl"?><html>
   <head>
      <this-is section="expressions" page="path" subpage=""/>
      <!--
           Generated at 2011-12-09T20:47:22.916Z--><title>Saxonica: XSLT and XQuery Processing: Path expressions</title>
      <meta name="coverage" content="Worldwide"/>
      <meta name="copyright" content="Copyright Saxonica Ltd"/>
      <meta name="title" content="Saxonica: XSLT and XQuery Processing: Path expressions"/>
      <meta name="robots" content="noindex,nofollow"/>
      <link rel="stylesheet" href="../saxondocs.css" type="text/css"/>
   </head>
   <body class="main">
      <h1>Path expressions</h1>
      <p>A path expression is a sequence of steps separated by the <code>/</code> or <code>//</code> operator.
For example, <code>../@desc</code> selects the <code>desc</code> attribute of the parent of the context
node.</p>
      <p>In XPath 2.0, path expressions have been generalized so that any expression can be used as an operand
of <code>/</code>, (both on the left and the right), so long as its value is a sequence of nodes. For
example, it is possible to use a union expression (in parentheses) or a call to the <code>id()</code>
or <code>key()</code> functions. The right-hand operand is evaluated once for each node in the sequence
that results from evaluating the left-hand operand, with that node as the context item. In the result
of the path expression, nodes are sorted in document order, and duplicates are eliminated.</p>
      <p>In practice, it only makes sense to use expressions on the right of <code>/</code> if they depend
on the context item. It is legal to write <code>$x/$y</code> provided both <code>$x</code> and
<code>$y</code> are sequences of nodes, but the result is exactly the same as writing <code>./$y</code>.</p>
      <p>Note that the expressions <code>./$X</code> or <code>$X/.</code> can be used to remove duplicates
from <code>$X</code> and sort the results into document order. The same effect can be achieved by writing
<code>$X|()</code></p>
      <p>The operator <code>//</code> is an abbreviation for <code>/descendant-or-self::node()/</code>.
An expression of the form <code>/E</code> is shorthand for <code>root(.)/E</code>, and the expression
<code>/</code> on its own is shorthand for <code>root(.)</code>.</p>
      <p>The expression on the left of the <code>/</code> operator must return a node or sequence of nodes. The
expression on the right can return either a sequence of nodes or a sequence of atomic values (but not a mixture 
of the two). This allow constructs such as <code>$x/number()</code>, which returns the sequence obtained
by converting each item in $x to a number.</p>
      <table width="100%">
         <tr>
            <td>
               <p align="right"><a class="nav" href="cast.xml">Next</a></p>
            </td>
         </tr>
      </table>
   </body>
</html>