XML Services supports the following XPath syntax:
xpath::= or_expr or_expr::= and_expr | and_expr TOKEN_OR or_expr and_expr::= union_expr | union_expr TOKEN_AND and_expr union_expr::= intersect_expr | intersect_expr TOKEN_UNION union_expr intersect_expr::= comparison_expr | comparison_expr TOKEN_INTERSECT intersect_expr comparison_expr::= range_exp | range_expr general_comp comparisonRightHandSide general_comp::= TOKEN_EQUAL | TOKEN_NOTEQUAL | TOKEN_LESSTHAN | TOKEN_LESSTHANEQUAL | TOKEN_GREATERTHAN | TOKEN_GREATERTHANEQUAL range_expr::= unary_expr | unary_expr TOKEN_TO unary_expr unary_expr::= TOKEN_MINUS path_expr | TOKEN_PLUS path_expr | path_expr comparisonRightHandSide::= literal path_expr::= relativepath_expr | TOKEN_SLASH | TOKEN_SLASH relativepath_expr | TOKEN_DOUBLESLASH relativepath_expr relativepath_expr::= step_expr | step_expr TOKEN_SLASH relativepath_expr | step_expr TOKEN_DOUBLESLASH relativepath_expr step_expr::= forward_step predicates | primary_expr predicates | predicates primary_expr::= literal | function_call | (xpath) function_call::= tolower([xpath]) | toupper([xpath]) | normalize-space([xpath]) | concat([xpath [,xpath]...]) forward_step::= abbreviated_forward_step abbreviated_forward_step::= name_test | TOKEN_ATRATE name_test | TOKEN_PERIOD name_test::= q_name | wild_card | text test text_test ::= TOKEN_TEXT TOKEN_LPAREN TOKEN_RPAREN literal::= numeric_literal | string_literal wild_card::= TOKEN_ASTERISK q_name::= TOKEN_ID string_literal::= TOKEN_STRING numeric_literal::= TOKEN_INT | TOKEN_FLOATVAL| | TOKEN_MINUS TOKEN_INT | TOKEN_MINUSTOKEN_FLOATVAL predicates::= | TOKEN_LSQUARE expr TOKEN_RSQUARE predicates | TOKEN_LSQUARE expr TOKEN_RSQUARE
The following tokens are supported by the XML Services subset of XPath:
APOS ::= '''
DIGITS ::= [0-9]+
NONAPOS ::= '^''
NONQUOTE ::= '^"'
NONSTART ::= LETTER | DIGIT | '.' | '-' | '_' | ':'
QUOTE ::= '"'
START ::= LETTER | '_'
TOKEN_AND ::= 'and'
TOKEN_ASTERISK ::= '*'
TOKEN_ATRATE ::= '@ '
TOKEN_COMMA ::= ','
TOKEN_DOUBLESLASH ::= '//'
TOKEN_EQUAL ::= '='
TOKEN_GREATERTHAN ::= '>'
TOKEN_GREATERTHANEQUAL ::= '>='
TOKEN_INTERSECT ::= 'intersect'
TOKEN_LESSTHAN ::= '<'
TOKEN_LESSTHANEQUAL ::= '<='
TOKEN_LPAREN ::= '('
TOKEN_LSQUARE ::= '['
TOKEN_MINUS ::= '-'
TOKEN_NOT ::= 'not'
TOKEN_NOTEQUAL ::= '!='
TOKEN_OR ::= 'or'
TOKEN_PERIOD ::= '.'
TOKEN_PLUS ::= '+'
TOKEN_RPAREN ::= ')'
TOKEN_RSQUARE ::= ']'
TOKEN_SLASH ::= '/'
TOKEN_TO ::= 'to '
TOKEN_UNION ::= '|' | 'union'
TOKEN_ID ::= START [NONSTART...]
TOKEN_FLOATVAL ::= DIGITS | '.'DIGITS | DIGITS'.'DIGITS
TOKEN_INT ::= DIGITS
TOKEN_STRING ::=
QUOTE NONQUOTE... QUOTE
| APOS NONAPOS... APOS
TOKEN_TEXT ::= 'text'