Эти определения эквивалентны. На практике следует пользоваться тем, которое кажется более понятным.
□ body— соответствует элементам bodyс нулевым пространством имен;
□ xhtml:body— соответствует элементам body, принадлежащим пространству имен с префиксом xhtml;
□ body/a— соответствует дочерним элементам аэлемента body;
□ *— соответствует любому элементу, который принадлежит нулевому пространству имен;
□ а[1]— соответствует каждому первому элементу асвоего родительского узла; элемент будет соответствовать этому паттерну, если ему не предшествует никакой братский элемент a— то есть из всех дочерних элементов анекоторого узла этому паттерну будет соответствовать только первый в порядке просмотра документа элемент;
□ a[position() mod 2 = 0]— соответствует каждому четному элементу aсвоего родительского узла; иначе говоря, из всех элементов анекоторого узла этому паттерну будут соответствовать только четные;
□ /— соответствует корневому узлу;
□ /html— узел будет соответствовать этому паттерну тогда и только тогда, когда он является элементом с именем htmlи нулевым пространством имен и находится при этом в корне элемента;
□ //html— соответствует любому элементу htmlдокумента, принадлежащему нулевому пространству имен; этот паттерн равносилен паттерну html;
□ *[starts-with(local-name(), 'A') or starts-with(local-name(), 'a')]— соответствует любому элементу, имя которого начинается на букву "а"в любом регистре символов;
□ *[string-length(local-name())=2]— соответствует любому элементу, локальная часть имени которого состоит из двух символов;
□ *[starts-with(namespace-uri(),'http') or starts-with(namespace-uri(), 'HTTP')]— соответствует любому элементу, URI пространства имен которого начинается на "http"или "HTTP";
□ br[not(*)]— соответствует элементу br, который не имеет дочерних элементов;
□ id('i')— соответствует элементу, уникальный атрибут которого (атрибут, имеющий тип ID) равен "i";
□ id('i')/@id— соответствует атрибуту idэлемента, уникальный атрибут которого равен "i"; заметим, что уникальный атрибут элемента вовсе не обязательно должен иметь имя id;
□ key('name', 'html')/@href— соответствует атрибуту hrefузла, значение ключа с именем "name"которого равно "html";
□ *|@*— соответствует любому элементу или атрибуту;
□ a|b|с— соответствует элементам а, bи с;
□ node()— соответствует любому узлу, кроме узла атрибута и пространства имен (поскольку они не являются дочерними узлами своих родителей);
□ node() | attribute::* | namespace::*— соответствует любому узлу, включая узлы атрибутов и пространств имен;
□ node()[not(self::text())]— соответствует любому узлу, кроме текстового узла, узла атрибута и узла пространства имен.
Выражения XPath являются наиболее общими конструкциями этого языка. Пути выборки, разобранные ранее, — это всего лишь частный случай выражения. Выражения включают в себя арифметические и логические операции, вызов функций, операции с путями выборки и так далее.
Выражениям языка соответствует нетерминал Expr. И хотя синтаксическое правило, определяющее этот нетерминал, записывается очень просто, в данный момент оно нам абсолютно ничего не скажет.
Базовая конструкция, использующаяся в выражениях, называется первичным выражением (от англ. primary expression). Первичные выражения могут быть переменными, литералами, числами, вызовами функций, а также обычными выражениями Expr, сгруппированными в круглых скобках:
[XP15] PrimaryExpr ::= VariableReference
| '(' Expr ')'
| Literal
| Number
| FunctionCall
Переменные вызываются в выражениях XPath по своему имени, которому предшествует символ " $". Например, если мы объявили переменную nodes:
то использовать в выражениях мы ее будем как $nodes.
Переменные, так же как элементы и атрибуты XML, могут иметь расширенные имена вида QName, состоящие из префикса пространства имен и локальной части имени. Это позволяет создавать переменные, принадлежащие различным пространствам имен.
Пример
Мы можем определить две переменные с одинаковыми локальными частями имен в разных пространствах, используя при определении имени префикс. Естественно, префикс должен быть заранее связан с URI пространства имен.
Читать дальше