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

Выбор корневого узла

Как вы уже видели, выбрать корневой узел можно при помощи образца выбора «/», как, например:

Выбор элементов

Можно выбирать элементы, просто задавая их имена, как мы уже видели. Следующий шаблон выбирает элементы

:

Выбор дочерних элементов

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

, которые являются дочерними для элементов
. Для этого можно задать выражение "
PLANET/NAME
". Вот правило, окружающее текст таких элементов в элемент HTML
<Н3>
:

Можно также использовать символ * в качестве символа-подстановки, что соответствует любому элементу. (* может выбирать только элементы, однако образец @* выбирает любой атрибут.) Например, следующее правило применяется ко всем элементам

, которые являются внуками элементов
:

Выбор потомков элемента

В предыдущем разделе при помощи выражения "

PLANET/NAME
" я выбирал все элементы
, являющиеся прямыми потомками элементов
, а при помощи выражения "
PLANET/*/NAME
" — все элементы
, являющиеся внуками элементов
. Есть, однако, более простой способ выполнить оба выбора — применить выражение "
PLANET//NAME
", выбирающее все элементы
, находящиеся внутри элементов
, независимо от глубины вложенности (соответствующие элементы называются потомками элемента
). Иными словами, "
PLANET//NAME
" выбирает "
PLANET/NAME
", "
PLANET/*/NAME
", "
PLANET/*/*/NAME
" и т.д.:

Выбор атрибутов

Как было показано в главе 3, «Создание и применение шаблонов», можно выбирать атрибуты, если предварять их имена префиксом @. Вы уже работали с атрибутом

UNITS
, который поддерживают большинство детей элементов
:

Earth

1

1

2107

1

128.4

Чтобы извлечь единицы измерения и отобразить их вместе со значениями массы и т.п., можно выбрать атрибут

UNITS
при помощи
@UNITS
(листинг 4.1).

Листинг 4.1. Выбор атрибутов

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

    .

    .

    .

    .

    .

    .





Теперь результирующая HTML-таблица включает не только значения, но и их единицы измерения:

</code></pre></p><p><pre><code>   The Planets Table</code></pre></p><p><pre><code>

   The Planets Table

    .

    .

    .

   .

   .

   .

Mercury.0553 (Earth = 1)1516 miles
Venus.815 (Earth = 1)3716 miles

Для выбора всех атрибутов элемента можно также использовать подстановку. Например, "

PLANET/@*
" выбирает все атрибуты элементов
.

Формальное определение образцов выбора

Определение образцов выбора приводится также в рекомендации XSLT W3C. Образцы выбора определяются в терминах выражений XPath следующим образом: «Синтаксис для образцов является подмножеством для выражений [XPath]. В частности, пути расположения, удовлетворяющие определенным ограничениям, могут использоваться как образцы. Выражение, в то же время являющееся образцом, всегда вычисляется в объект типа набора узлов. Узел удовлетворяет образцу, если узел является членом результата вычисления образца как выражения по отношению к возможному контексту; возможный контекст — это контекст, контекстный узел которого был выбран, или один из его предков».

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