Листинг 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) демонстрируется работа с этой осью. На этот раз я хочу добавить примечание к элементу Меркурия: Sorry, Mercury has blown up and is no longer available.
(Извините, но Меркурий взорвался и больше не доступен.). Чтобы найти Меркурий, мне достаточно только проверить, имеет ли какой-либо потомок элемента строковое значение « Mercury
», что я сделаю при помощи выражения XPath внутри предиката выбора.
Листинг 7.6. Применение оси descendant
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Sorry. Mercury has blown up and is no longer available.
Вот результирующий документ, дополненный новым элементом только для Меркурия:
Mercury
.0553
58.65
1516
.983
43.4
Sorry, Mercury has blown up and is no longer available.
Venus
.815
116.75
3716
.943
66.8
.
.
.
Применение оси descendant-or-self
Ось descendant-or-self
содержит всех потомков контекстного узла и сам контекстный узел. Заметьте, однако, что она не содержит атрибутов и узлов пространств имен.
В следующем примере (листинг 7.7) демонстрируется работа с осью. В этом случае я создал упрощенную таблицу стилей (подробнее об упрощенных таблицах стилей см. главу 2), которая обрабатывает все элементы с использованием потомков, генерируя уже знакомую нам HTML-таблицу данных о планетах.
Листинг 7.7. Применение оси descendant-or-self
The Planets Table
Вот и все. Я применил здесь упрощенную таблицу стилей, чтобы подчеркнуть, что при помощи таких осей потомков, как descendant
или descendant-or-self
, вы можете автоматически обрабатывать все выбираемые узлы, во многом аналогично тому, как это делают элементы или .
Ось following (следующий) содержит все узлы, расположенные после контекстного узла в соответствии с установленным в документе порядком (другими словами, в порядке, в котором они появляются в документе, начиная с его начала), исключая всех потомков контекстного узла, а также исключая узлы атрибутов и пространств имен.
В этом примере (листинг 7.8) я выбираю каждый элемент и копирую все последующие элементы в результирующий документ.
Листинг 7.8. Применение оси following
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Далее показан результат. Обратите внимание на то, что, когда этот шаблон выбирает элемент Меркурия, он копирует все последующие элементы — то есть Венеру, затем всех потомков Венеры, далее Землю и затем всех потомков Земли. После этого он выбирает элемент Венеры и копирует все следующие элементы, то есть Землю и всех потомков Земли:
Venus
.815
116.75
3716
.943
66.8
Venus
.815
116.75
3716
.943
66.8
Earth
1
1
2107
1
128.4
Earth
1
1
2107
1
128.4
Earth
1
1
2107
1
128.4
Earth
1
1
2107
1
128.4
С другой стороны, при использовании оси following-sibling
в результирующий документ будут скопированы только следующие братья, то есть только элементы , как мы увидим в следующем разделе.
Применение оси following-sibling
Ось following-sibling
содержит всех последующих братьев контекстного узла.
Например, я могу выбрать каждый элемент и скопировать в результирующий документ все узлы в оси following-sibling
следующим образом (листинг 7.9).
Листинг 7.9. Применение оси following-sibling
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
При этом сначала копируются два узла-брата, следующие за Меркурием (Венера и Земля), затем копируется следующий узел-брат Венеры, Земля. У самой Земли нет следующих за ней братьев, поэтому результат выглядит так:
Читать дальше