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

;

;

;

;

;

;

;

;

;

.

Рабочий проект XSLT 1.1 добавляет еще один элемент высокого уровня:

В книге мы поработаем со всеми этими официальными элементами XSLT высокого уровня.

Заметьте, что, в дополнение ко всем элементам высокого уровня, вы можете также повсюду использовать обычные комментарии XML, поскольку таблицы стилей XSLT являются также документами XML:

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

   .

   .

   .

В дополнение к официальным элементам высокого уровня, некоторые процессоры XSLT определяют свои собственные элементы высокого уровня, использующие пространства имен, отличающиеся от пространства имен XSL. Функциональность таких элементов полностью определяется разработчиком процессора XSLT.

Вы также можете определять собственные элементы высокого уровня, называемые «элементами высокого уровня, определенными пользователем». Эти элементы должны иметь пространство имен, отличное от XSL и элементов, определенных разработчиком процессора. Процессор XSLT игнорирует определенные пользователем элементы высокого уровня; но, поскольку вы способны сами получить доступ ко всему документу при помощи функции документа (как мы увидим в главе 8), вы можете самостоятельно работать с этими элементами.

Из всех элементов высокого уровня самым популярным является элемент

:

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

  .

  .

  .

 .

 .

 .

Создание шаблонов и работа с ними — суть XSLT, и сейчас мы рассмотрим этот элемент, продолжая создавать таблицу

planets.xsl
.

Элемент

Шаблоны XSL позволяют задать способ выполнения вашего преобразования. Каждый элемент

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

• 

match
(необязательный). Задает шаблон, выбирающий обрабатываемые узлы. Устанавливается в допустимый шаблон;

• 

name
(необязательный). Содержит имя шаблона, что разрешает его вызов. Если вы не используете этот атрибут, вы должны использовать атрибут
match
. Принимает значение типа
QName
;

• 

priority
(необязательный). Положительное или отрицательное целое или действительное число, задающее приоритет шаблона. Используется, когда один и тот же узел удовлетворяет нескольким шаблонам. Устанавливается в число;

• 

mode
(необязательный). Если вы применяете
к множеству узлов, будут использоваться только шаблоны с совпадающим режимом (mode). Принимает значение типа
QName
.

Каждый такой элемент

называется правилом (rule). В общем случае элемент
может содержать ноль или более элементов
(как мы увидим в главе 9), за которыми следует тело шаблона, задающего способ осуществления преобразования.

Тела шаблонов

Шаблоны формируются по жестко заданным правилам. Они способны содержать элементы

, за которыми следует тело шаблона; в последнем могут содержаться данные
PCDATA
, инструкции XSLT, элементы расширения и элементы буквального результата.

Инструкции XSLT

В теле шаблона может присутствовать ряд элементов XSLT, называемых инструкциями:

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

.

В теле шаблона больше никакие элементы XSLT непосредственно появиться не могут. Как вы увидите в главе 9, элемент

может появиться в шаблоне перед телом, но он не называется инструкцией XSLT. В шаблонах могут также появляться и другие элементы XSLT, такие как
,
и
, но только в определенных местах, поэтому W3C не называет их инструкциями. Далее в книге мы рассмотрим, как использовать каждую из этих инструкций.

Элементы расширения

Элементы расширения рассматриваются в главе 5; эти элементы, расширяющие XSLT, определяются пользователем или процессором XSLT. Во многих процессорах XSLT были определены собственные расширения — и это стало одной из причин, по которым W3C представил рабочий проект XSLT 1.1, где механизм расширений был более регламентирован. Вероятно, эта функциональность будет включена в XSLT 2.0.

Элементы буквального результата

Если элемент в теле шаблона не является инструкцией XSL или элементом расширения, процессор XSLT должен рассматривать его в качестве элемента буквального результата. Это означает, что элемент должен трактоваться буквально и копироваться в результирующее дерево (то есть копироваться в выходное дерево, созданное процессором XSLT).

Например, в следующем теле шаблона элемент

является элементом буквального результата, который будет скопирован в выходной документ:

RADIUS

Элементы буквального результата могут сами по себе иметь содержимое, которое затем трактуется как еще одно тело шаблона и разбирается процессором XSLT. Позже в настоящей главе мы посмотрим, как работает этот механизм.

Элементы буквального результата могут также обладать атрибутами, которые интерпретируются процессором XSLT. Например, при помощи атрибута

version
 можно указать, что все элементы XSLT внутри элемента буквального результата должны быть элементами XSLT версии 1.0:

RADIUS

В следующем списке перечислены все возможные атрибуты элемента буквального результата:

• Attribute Value Templates, шаблон значений атрибута (необязательный). Любые выражения XPath в фигурных скобках вычисляются, и результат в виде строкового значения копируется в атрибут в результирующем дереве. Устанавливается в шаблон значений атрибута (см. главу 3);

• 

xsl:exclude-result-prefixes
(необязательный). Определяет, какие пространства имен не будут скопированы в результирующее дерево. Принимает значения списка префиксов пространств имен, разделенных символами- разделителями;

• 

xsl:extension-element-prefixes
(необязательный). Заставляет процессор XSLT трактовать дочерние элементы элемента буквального результата в перечисленных пространствах имен как элементы расширения, а не элементы буквального результата;

• 

xsl:use-attribute-sets
(необязательный). Атрибуты в перечисленных наборах атрибутов добавляются в элемент буквального результата и копируются в результирующее дерево. Принимает значение списка
QName
, идентифицирующих поименованные элементы
;

• 

xsl:version
(необязательный). Устанавливает версию элементов XSL в элементе буквального результата. Принимает численное значение.

Теперь можно начать работать с этой информацией.

Совпадающие элементы в шаблонах

Для указания того, с каким узлом или узлами вы хотите работать в шаблоне, в XSLT имеются разнообразные способы поиска или выбора узлов. Следует установить атрибут

match
элемента
в образец (pattern), определяющий имя узла или узлов, с которыми вы хотите работать. В главе 3, посвященной шаблонам, будет показано, как создавать образцы. Например, образец «/» соответствует корневому узлу; образец «*» задает любой узел элемента; образцу «PLANET» удовлетворяют все узлы элемента
и т.д.

Для начала я создал короткий пример, заменяющий корневой узел, — а следовательно, и весь документ — на HTML-странице. Первое, что я сделал, — создал шаблон с элементом

, установив атрибут
match
в образец для совпадения

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

 .

 .

 .

Когда устанавливается соответствие с корневым узлом, шаблон применяется к самому узлу. В данном случае (листинг 2.2) я хочу заменить корневой узел документом HTML, поэтому я только включу этот документ HTML непосредственно в качестве содержимого элемента

.

Листинг 2.2. Простейшее преобразование

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

</b></code></pre></p><p><pre><code><b>     A trivial transformation</b></code></pre></p><p><pre><code><b>

    This transformation has replaced the entire document.

Результат: при помощи элемента

я установил правило в таблице стилей. Когда процессор XSL считывает документ, первым узлом является корневой узел. Это правило находит данный корневой узел, и от того процессор XSL копирует литералы в результирующее дерево, что даст нам HTML doc и заменит его документом HTML, генерируя следующий результат:

</code></pre></p><p><pre><code>   A trivial transformation</code></pre></p><p><pre><code>

  This transformation has replaced the entire document.

Рассмотренный пример иллюстрирует первое, устаревшее преобразование. Была создана простая таблица стилей с единственным элементом

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

Элемент