<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet href="../../make-menu.xsl" type="text/xsl"?><html>
   <head>
      <this-is section="xsl-elements" page="patterns" subpage="syntax"/>
      <!--
           Generated at 2011-12-09T20:47:22.916Z--><title>Saxonica: XSLT and XQuery Processing: Pattern syntax</title>
      <meta name="coverage" content="Worldwide"/>
      <meta name="copyright" content="Copyright Saxonica Ltd"/>
      <meta name="title" content="Saxonica: XSLT and XQuery Processing: Pattern syntax"/>
      <meta name="robots" content="noindex,nofollow"/>
      <link rel="stylesheet" href="../../saxondocs.css" type="text/css"/>
   </head>
   <body class="main">
      <h1>Pattern syntax</h1>
      <p>Saxon supports the full XSLT syntax for patterns. The rules below describe
a simplified form of this syntax (for example, it omits the legal but useless pattern
'@comment()'):</p>
      <div class="codeblock"
           style="border: solid thin; background-color: #B1CCC7; padding: 2px">
         <pre>
            <code>
pattern          ::= path ( '|' path )*
path             ::= anchor? remainder? (Note 1)

anchor           ::= '/' | '//' | id | key
id               ::= 'id' '(' value ')'
key              ::= 'key' '(' literal ',' value ')'
value            ::= literal | variable-reference

remainder        ::= path-part ( sep path-part )* 
sep              ::= '/' | '//'
path-part        ::= node-match predicate+
node-match       ::= kind-match | type-match   
kind-match       ::= element-match | 
                     text-match | 
					 attribute-match | 
					 pi-match | 
					 any-node-match
element-match    ::= 'child::'? ( name | '*' ) 
text-match       ::= 'text' '(' ')' 
attribute-match  ::= ('attribute::' | '@') ( name | '*' ) 
pi-match         ::= 'processing-instruction' '(' literal? ')'
any-node-match   ::= 'node' '(' ')'

type-match       ::= ('element'|'attribute') 
                        '(' ('*'|node-name) (',' type-name) ')'

predicate        ::= '[' ( boolean-expression | 
                           numeric-expression ) ']'
</code>
         </pre>
      </div>
      <p>Note 1: not all combinations are allowed.
 If the anchor is '//' then the remainder is mandatory.</p>
      <p>The form of a literal is as defined in expressions; and a predicate is itself a boolean
 or numeric expression. As with predicates in expressions, a numeric predicate <code>[P]</code> is shorthand
 for the boolean predicate <code>[position()=P]</code>.</p>
      <p>Informally, a pattern consists of either a single path or a sequence of paths separated
 by vertical bars. An element matches the match-pattern if it matches any one of the paths.</p>
      <p>A path consists of a sequence of path-parts separated by either "/" or "//".
 There is an optional separator ("/" or "//") at the start; a "//" has no effect and
 can be ignored. The last path-part may be an element-match, a text-match, an
  attribute-match, a pi-match, or a node-match; in practice, a path-part other than the last
   should be an element-match. </p>
      <p>The axis syntax <code>child::</code> and <code>attribute::</code> may also be used in patterns, as described in the XSLT
specification.</p>
      <table width="100%">
         <tr>
            <td>
               <p align="right"><a class="nav" href="patterns-30.xml">Next</a></p>
            </td>
         </tr>
      </table>
   </body>
</html>