XPath ist eine Sprache zur Selektion von Teilmengen innerhalb eines XML-Dokuments.
Folgende Achsen teilen das Dokument in disjunkte Teilmengen:

| Nicht-Terminal | Terminale | Kommentar | |
| expression | = | location-path | |
| location-path | = | absolute-location / relative-location | |
| absolute-location | = | /[ relative-location ] | |
| relative-location | = | *(relative-location /) step | |
| step | = | [ axis-specifier ] node-test *( predicate ) | |
| axis-specifier | = | axis-name :: | |
| / | @ | entspricht "attribute::" | |
| / | . | entspricht "self::node()" | |
| / | .. | entspricht "parent::node()" | |
| / | // | entspricht "/descendant-or-self::node()/" | |
| axis-name | = | ancestor | Alle direkten Vorfahren |
| / | ancestor-or-self | Alle direkten Vorfahren inklusive Kontextknoten | |
| / | attribute | Alle Attribute (Attribute sind KEINE Kinder) | |
| / | child | Direkte Kindknoten, aber nichr die | |
| / | descendant | Alle Nachfahren | |
| / | descendant-or-self | Alle Nachfahren inklusive Kontextknoten | |
| / | following | Alle Element ab dem Kontextknoten | |
| / | following-sibling | Ältere Geschwister | |
| / | namespace | ||
| / | parent | Der Elternknoten | |
| / | preceding | Alle Element bis zum Kontextknoten außer den direkten Vorfahren | |
| / | preceding-sibling | Jüngere Geschwister | |
| / | self | Nur der Kontextknoten | |
| node-test | = | name-test | |
| / | node-type () | ||
| / | processing-instruction (literal ) | ||
| name-test | = | *CHAR | Nur Knoten mit diesem Namen |
| node-type | = | text | Nur Textknoten |
| / | comment | Nur Kommentare | |
| / | node | Jeden der 7 Knotentypen | |
| predicate | = | [predicate-expr ] | |
| predicate-expr | = | number | Index in der ausgewählten Knotenmenge |
| / | location-step rel-op qstring | Vergleich | |
| / | function | ||
| function | = | nodeset-function / string-function / boolean-function | |
| nodeset-function | = | last () | number: Anzahl der Konten im Kontext |
| / | position () | number: Index des aktuellen Knotens | |
| / | count (node-set ) | number: Anzahl der Knoten | |
| / | id (object ) | node-set: | |
| / | local-name (node-set ) | string | |
| / | namespace-uri (node-set ) | string | |
| / | name (node-set ) | string | |
| string-function | = | string (object ) | string |
| / | concat (string *( ,string) ) | string | |
| / | starts-with (string ,string ) | boolean | |
| / | contains (string ,string ) | boolean | |
| / | substring-before (string ,string ) | string | |
| / | substring-after (string ,string ) | string | |
| / | substring (string ,number ,number ) | string | |
| / | string-length (string ) | number | |
| / | normalize-space (string ) | string | |
| / | translate (string ,string ,string ) | string | |
| boolean-function | = | boolean (object ) | boolean |
| / | not (boolean ) | boolean | |
| / | true () | boolean | |
| / | false () | boolean | |
| / | lang (string ) | boolean | |
| numeric-function | = | number (object ) | number |
| / | sum (node-set ) | number | |
| / | ceiling (number ) | number | |
| / | floor (number ) | number | |
| / | round (number ) | number | |
| rel-op | = | </ >/ <=/ >=/ =/ !=/ and/ or | |
| arith-op | = | +/ -/ */ div/ mod | |
| number | = | *DIGIT | |
| qstring | = | DQUOTE *CHAR DQUOTE |
XPointer bieten einen standartisierte Syntax, um in
URIs auf Teile
innerhalb eines XML-Dokuments zu verweisen. Die Funktion
range erweitert XPath um die
Möglichkeit, Substrings in Textknoten zu identifizieren.
| Nicht-Terminal | Terminale | Kommentar | |
| xpointer | = | xpointer (xpath *range ) | Element mit allen Kinden |
| range | = | range (xpath ) | Element mit umgebenden Elementen |
| / | range-inside (xpath ) | Element ohne umgebende Elemente | |
| / | range-to (xpath ) | ||
| / | string-range (xpath, string, first, last ) |