.815
116.75
3716
.943
66.8
Earth
1
1
2107
1
128.4
Ось self
содержит только контекстный узел. В соответствии с одним из сокращений XPath, как мы увидим дальше, вместо « self::node()
» можно использовать «.».
Эту ось полезно иметь в виду, поскольку, как вы помните из главы 4, если не задать ось, осью по умолчанию будет child::
, а в некоторых случаях вам может понадобиться обратиться к действующему узлу. Например, [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
возвращает дочерние элементы контекстного узла;
• *
возвращает все дочерние элементы контекстного узла;
Читать дальше