| expr | → | or‑expr |
| or‑expr | → | and‑expr (name and‑expr)* |
| and‑expr | → | equality‑expr (name equality‑expr)* |
| equality‑expr | → | relational‑expr ((= | !=) relational‑expr)* |
| relational‑expr | → | additive‑expr ((<= | >= | < | >) additive‑expr)* |
| additive‑expr | → | multiplicative‑expr ((+ | -) multiplicative‑expr)* |
| multiplicative‑expr | → | unary‑expr ((* | name) unary‑expr)* |
| unary‑expr | → | - unary‑expr | union‑expr |
| union‑expr | → | path‑expr (| path‑expr)* |
| path‑expr | → | location‑path − function‑call | filter‑expr ((// | /) relative‑location‑path)? |
| filter‑expr | → | primary‑expr predicate* |
| location‑path | → | absolute‑location‑path | relative‑location‑path |
| absolute‑location‑path | → | abbreviated‑absolute‑location‑path | / relative‑location‑path? |
| abbreviated‑absolute‑location‑path | → | // relative‑location‑path |
| relative‑location‑path | → | step ((// | /) step)* |
| step | → | axis‑specifier node‑test predicate* | abbreviated‑step |
| axis‑specifier | → | axis‑name :: | abbreviated‑axis‑specifier |
| axis‑name | → | name |
| abbreviated‑axis‑specifier | → | @ | <empty> |
| node‑test | → | name ( literal ) | node‑type ( ) | name‑test |
| node‑type | → | name |
| name‑test | → | * | ncname : * | qname |
| abbreviated‑step | → | .. | . |
| literal | → | dq‑string | sq‑string |
| number | → | num |
| predicate | → | [ predicate‑expr ] |
| predicate‑expr | → | expr |
| primary‑expr | → | function‑call | variable‑reference | ( expr ) | literal | number |
| variable‑reference | → | $ qname |
| function‑call | → | function‑name ( (argument % ,)? ) |
| function‑name | → | qname − node‑type |
| argument | → | expr |
| qname | → | prefixed‑name | unprefixed‑name |
| prefixed‑name | → | prefix : local‑part |
| prefix | → | ncname |
| unprefixed‑name | → | local‑part |
| local‑part | → | ncname |
| ncname | → | name |