XSLT — страница 62 из 124

child::*/child::NAME
выбирает все элементы
, являющиеся правнуками контекстного узла. В XPath кроме имен и символа подстановки можно также применять, как и в образцах выбора, следующие условия узлов:

• условие узла

comment()
выбирает узлы комментария;

• условие узла

node()
выбирает узел любого типа;

• условие узла

processing-instruction()
выбирает узел инструкции обработки. В скобках можно указать название выбираемой инструкции обработки;

• условие узла

text()
выбирает текстовый узел

Например, в листинге 7.2 таблица стилей находит в документе все комментарии при помощи условия узла

comment()
и создает для каждого комментария новый,
(Внимание! Найден комментарий!).

Листинг 7.2. Выбор комментариев

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

Warning: comment found!

При применении этой таблицы стилей к

planets.xml
получается следующий документ:

Шаги расположения XPath, часть 3: предикаты

Предикат в шаге расположения XPath сам содержит заключенное в скобки выражение XPath, которое вычисляется в истину или ложь. Когда результатом вычисления выражения является строка, XPath считает ее истиной, если строка не пуста. Когда результат — набор узлов, XPath считает его истиной, если он не пуст. Когда результат — число, то общий результат будет считаться истиной, если это число совпадает с контекстной позицией — например,

PLANET[3]
будет истиной тогда и только тогда, когда истиной будет
PLANET[position()=3]
.

Предикаты содержат выражения XPath наподобие тех, которые встречались нам на протяжении этой главы: редко когда выражение возвращает набор узлов, главным образом возвращаются строки, числа или логические значения. Например, путь расположения

preceding-sibling::MASS[position()*4]
выбирает четыре предыдущих элемента-брата
для контекстного узла.

Применение осей XPath

К этому моменту мы рассмотрели три части шагов расположения — ось, условие узла и предикат. Вы должны быть знакомы с этими элементами по проделанной нами работе с образцами выбора, но обратите внимание на ось в предыдущем примере —

preceding-sibling
. До сих пор мы видели только оси, выбиравшие образцы XSLT — оси
child
и
attribute
; теперь же мы рассмотрим новые оси, возможные в полных выражениях XPath, и начнем с оси
ancestor
.

Применение оси ancestor

Ось

ancestor
(предок) содержит всех предков контекстного узла, включая родителей, дедушек, прадедушек и т.д. Эта ось всегда содержит корневой узел — если только контекстным узлом не является сам корневой узел.

Взгляните на листинг 7.3, в котором при помощи оси

ancestor
осуществляется поиск имен (хранимых в элементе
) всех предков элементов
.

Листинг 7.3. Применение оси ancestor

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


Вот результат применения этой таблицы стилей к

planets.xml
:

Mercury

Venus

Earth

Применение оси ancestor-or-self

Ось

ancestor-or-self
содержит всех предков контекстного узла, а также сам контекстный узел. Это означает, помимо прочего, что такая ось всегда содержит корневой узел.

В листинге 7.4 добавлены атрибуты

AUTHOR
со значением «Steve» в весь документ.

Листинг 7.4. planets.xml с атрибутами AUTHOR

Mercury

.0553

58.65

1516

.983

43.4

Venus

.815

116.75

3716

.943

66.8

Earth

1

1

2107

1

128.4

Предположим теперь, что я хочу перечислить по имени всех предков элементов

, имеющих атрибут
AUTHOR
, а также текущий элемент
, если у него есть атрибут
AUTHOR
. Это можно сделать при помощи оси
ancestor-or-self
и функции
local-name
(листинг 7.5).

Листинг 7.5. Применение оси ancestor-or-self

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


Вот результат; показаны выбранные предки всех трех элементов

, включая сам элемент
, при условии, что у него имеется атрибут
AUTHOR
:

PLANETS PLANET MASS

PLANETS PLANET

PLANETS

Применение оси descendant

Ось

descendant
(потомок) содержит всех потомков контекстного узла. Заметьте, что сюда не входят атрибуты или узлы пространств имен, поскольку они не считаются дочерними узлами.

В следующем примере (листинг 7.6) демонстрируется работа с этой осью. На этот раз я хочу добавить примечание к элементу