XPath - примеры запросов

Для проверки запросов откройте тестовую страницу

/ - выбрать корневой узел длкумента

/html - выбрать корневой элемент

/html/body/div - выбрать элемент div, который является прямым наследником элемента body

/html/body/div/* - выбрать все элементы, которые являются прямыми наследниками div

//li - выбрать все div элементы независимо от их позиции в документе

//li[1] - выбрать первый дочерний элемент li

//li[last()] - выбрать последний дочерний элемент li

//li[position()<3] - выбрать первый и второй дочерний элемент li в списке

(//li)[2] - выбрать второй элемент в общей структуре

//div[@name] - выбрать все div элементы, у которых есть атрибут name

//div[@name=’content’] - выбрать все div элементы у которых значение атрибута name равно content

//div[@name=’content’ or @class] - выбрать все div элементы у которых значение name равно content или если у них есть атрибут class

and - должны выполняться оба условия

or - должно выполняться хоть одно их условий

not() - инверсия значения

//div[contains(@class, ‘btn’)] - выбрать все div элементы у которых атрибут class содержит подстроку btn

//div[text()=’hello world’] - выбрать все элементы div внутри которых текст является hello world

//div[contains(., ‘world’)] - выбрать все элементы div у которых любой из вложенных элементов содержит слово world

//div[./span] - выбрать все элементы div у которых есть прямой наследник span

//div | //span - выбрать все элементы div или span

Оси

Оси — это база языка XPath. Для некоторых осей существуют сокращённые обозначения.

child:: — содержит множество элементов-потомков (элементов, расположенных на один уровень ниже). Это название сокращается полностью, то есть его можно вовсе опускать.

descendant:: — содержит полное множество элементов-потомков (то есть, как ближайших элементов-потомков, так и всех их элементов-потомков).

descendant-or-self:: — содержит полное множество элементов-потомков и текущий элемент. Выражение /descendant-or-self::node()/ можно сокращать до //. С помощью этой оси, например, можно вторым шагом организовать отбор элементов с любого узла, а не только с корневого: достаточно первым шагом взять всех потомков корневого. Например, путь //span отберёт все узлы span документа, независимо от их положения в иерархии, взглянув как на имя корневого, так и на имена всех его дочерних элементов, на всю глубину их вложенности.

ancestor:: — содержит множество элементов-предков.

ancestor-or-self:: — содержит множество элементов-предков и текущий элемент.

parent:: — содержит элемент-предок на один уровень назад. Это обращение можно заменить на ..

self:: — содержит текущий элемент. Это обращение можно заменить на .

following:: — содержит множество элементов, расположенных ниже текущего элемента по дереву (на всех уровнях и слоях), исключая собственных потомков.

following-sibling:: — содержит множество братских элементов того же уровня, следующих за текущим слоем.

preceding:: — содержит множество элементов, расположенных выше текущего элемента по дереву (на всех уровнях и слоях), исключая множество собственных предков.

preceding-sibling:: — содержит множество братских элементов того же уровня, предшествующих текущему слою.

attribute:: — содержит множество атрибутов текущего элемента. Это обращение можно заменить на символ @

namespace:: — содержит множество элементов, относящихся к тому или иному пространству имён (то есть присутствует атрибут xmlns).