[self::PLANET]
примет значение истины только если контекстным узлом будет элемент
.В следующем примере я объединяю шаблоны для элементов
и
в один шаблон. Поскольку у этих элементов разный формат, я должен обращаться с ними по-разному внутри одного и того же шаблона (что можно сделать проверкой значений оси self::NAME
, которая возвращает непустой набор узлов, если контекстным, узлом является элемент
, и self::MASS
, возвращающей непустой набор узлов, если контекстным узлом является элемент
):
.
.
.
На этом мы завершаем рассмотрение новых осей XPath. Давайте перейдем к примерам.
Примеры путей расположения
Мы изучили достаточно теории путей расположения. Но, понятно, лучше всего осваивать этот материал на примерах, поэтому я привожу следующий список примеров путей расположения (сокращенные варианты рассматриваются после этого списка):
•
child::PLANЕТ
. Возвращает дочерние элементы
контекстного узла;•
child::text()
. Возвращает все дочерние текстовые узлы контекстного узла;•
child::node()
. Возвращает всех детей контекстного узла;•
attribute::UNIT
. Возвращает атрибут UNIT
контекстного узла;•
descendant::PLANET
. Возвращает все элементы-потомки
контекстного узла;•
ancestor::PLANET
. Возвращает всех предков
контекстного узла;•
ancestor-or-self::PLANET
. Возвращает предков
контекстного узла. Если контекстным узлом тоже является
, возвращает также контекстный узел;•
descendant-or-self::PLANET
. Возвращает элементы-потомки
контекстного узла. Если контекстным узлом тоже является
, возвращает также контекстный узел;•
self::PLANET
. Возвращает контекстный узел, если им является элемент
;•
child::PLANET/descendant::NAME
. Возвращает элементы-потомки
дочерних элементов
контекстного узла;•
child::*/child::PLANET
. Возвращает всех внуков
контекстного узла;•
/
. Возвращает корневой узел;•
/descendant::PLANET
. Возвращает все элементы
в документе;•
/descendant::PLANET/child::NAME
. Возвращает все элементы
с родителем
в документе;•
child::PLANET[position()=3]
. Возвращает третьего ребенка
контекстного узла;•
child::PLANET[position()=last()]
. Возвращает последнего ребенка
контекстного узла;•
/descendant::PLANET[position() = 3]
. Возвращает третий элемент
в документе;•
child::PLANETS/child::PLANET[position()=4]/child::NAME[position()=3]
. Возвращает третий элемент
четвертого элемента
элемента
;•
child::PLANET[position()>3]
. Возвращает всех детей
контекстного узла после первых трех;•
preceding-sibling::NAME[position()=2]
. Возвращает второй предыдущий элемент-брат
контекстного узла;•
child::*[self::NAME or self::MASS]
. Возвращает детей
и
контекстного узла.•
child::*[self::NAME or self::MASS][position()=last()]
. Возвращает последнего ребенка
или
контекстного узла.Как видите, синтаксис некоторых выражений достаточно запутан, и набирать их также довольно долго. Но, как и для образцов, существует сокращенная форма синтаксиса XPath.
Сокращенный синтаксис XPath
Сокращения синтаксиса XPath могут быть весьма удобными. Ниже приведены правила:
•
self::node()
может быть сокращено как .
;•
parent::node()
может быть сокращено как ..
;•
child::childname
может быть сокращено как childname
;•
attribute::childname
может быть сокращено как @childname
;•
/descendant-or-self::node()/
может быть сокращено как //
.Например, путь расположения
.//PLANET
— сокращение для self::node()/descendant-or-self::node()/child::PLANET
. Можно также сократить выражение предиката [position()=3]
как [3]
, [position()=last()]
как [last()]
и т.д. Работать с путями расположения XPath при помощи сокращенного синтаксиса значительно проще. В следующем списке перечислен ряд примеров путей расположения с использованием сокращенного синтаксиса:•
PLANET
возвращает дочерние элементы
контекстного узла;•
*
возвращает все дочерние элементы контекстного узла;•
text()
возвращает все дочерние текстовые узлы контекстного узла;•
@UNITS
возвращает атрибут UNITS
контекстного узла;•
@*
возвращает все атрибуты контекстного узла;•
PLANET[3]
возвращает третьего ребенка
контекстного узла;•
PLANET[last()]
возвращает последнего ребенка
контекстного узла;•
*/PLANET
возвращает всех внуков
контекстного узла;•
/PLANETS/PLANET[3]/NAME[2]
возвращает второй элемент
третьего элемента
элемента
;•
//PLANET
возвращает всех потомков
корня документа;•
PLANETS//PLANET
возвращает элементы-потомки
дочерних элементов
контекстного узла;•
//PLANET/NAME
возвращает все элементы
, у которых есть родитель
;•
.
возвращает сам контекстный узел;•
.//PLANET
возвращает элементы-потомки