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

>

А вот результирующий документ (отметьте, что я сохранил только элементы

и
):

Mercury

.0553(Earth = 1)

Venus

.815(Earth = 1)

Earth

1(Earth = 1)

Таким способом можно фильтровать XML-документы, создавая новые XML-документы только с требуемыми данными.

Разрешение конфликтов шаблонов

Еще одним важным аспектом работы с шаблонами является разрешение конфликтов. Если двум шаблонам удовлетворяют один и тот же узел или набор узлов, для определения применяемого шаблона XSLT учитывает их приоритет.

У каждого шаблона есть приоритет по умолчанию, основанный на значении атрибута

select
. Как правило, чем более сужающим является правило выбора или выражение (например, "
PLANET
" и "
*
"), тем выше его приоритет. В главе 4 мы рассмотрим, как процессор определяет приоритеты и как он работает с шаблонами, имеющими одинаковый приоритет.

Приоритет шаблона можно установить при помощи атрибута

priority
. В приведенном ниже листинге 3.8 правило, созданное элементом
, имеет меньший приоритет, чем правило, созданное элементом
.

Листинг 3.8. Установка приоритета шаблона

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

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

     The Planets Table

NameMassRadiusDay



  (Very heavy)




Процессор XSLT выбирает шаблон с наивысшим приоритетом, который добавляет текст "

(Very heavy)
" после каждого значения массы. В следующем примере использован шаблон с наивысшим приоритетом:

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

   The Planets Table

NameMassRadiusDay
Mercury.0553(Very heavy)1516 miles58.65 days
Venus.815(Very heavy)3716 miles116.75 days
Earth1(Very heavy)2107 miles1 days

УСОВЕРШЕНСТВОВАНИЯ В XSLT 2.0

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

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

PLANET
" будет отдано предпочтение перед обобщенным условием "
*
".

Элемент

Элемент

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

• 

use-attribute-sets
. Задает названия наборов атрибутов, которые нужно применить к создаваемому элементу. Принимает значение списка
QName
, разделенных символами-разделителями. Этот атрибут можно использовать только в том случае, когда контекстный узел является элементом. Дополнительная информация о наборах атрибутов приведена в главе 6. 

Этот элемент может содержать тело шаблона, которое используется только когда копируется корневой узел или элемент. Заметьте, что при применении к корневому узлу элемент

не задействован, поскольку узел выходного документа создается автоматически.

Приведенная в листинге 3.9 таблица стилей впервые появилась в главе 2; все, что она делает, — копирует все элементы из исходного документа в результирующий.

Листинг 3.9. Таблица стилей, копирующая элементы

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