Приоритет шаблона можно установить при помощи атрибута priority
. В приведенном ниже листинге 3.8 правило, созданное элементом , имеет меньший приоритет, чем правило, созданное элементом .
Листинг 3.8. Установка приоритета шаблона
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
The Planets Table
|
|
|
|
(Very heavy)
Процессор XSLT выбирает шаблон с наивысшим приоритетом, который добавляет текст " (Very heavy)
" после каждого значения массы. В следующем примере использован шаблон с наивысшим приоритетом:
The Planets Table
The Planets Table
</Н1>
Name |
Mass |
Radius |
Day |
Mercury |
.0553(Very heavy) |
1516 miles |
58.65 days |
Venus |
.815(Very heavy) |
3716 miles |
116.75 days |
Earth |
1(Very heavy) |
2107 miles |
1 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">
Однако не копирует атрибуты — вот результат применения этой таблицы стилей к planets.xml
:
Mercury
.0553
58.65
1516
.983
43.4
Venus
.815
116.75
3716
.943
66.8
Earth
1
1
2107
1
128.4
Копирование атрибутов несколько сложнее, потому что нужно найти какой-либо способ применить к каждому атрибуту элемента. Это можно сделать, например, при помощи элемента , о котором пойдет речь в главе 5.
Листинг 3.10. Копирование атрибутов
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
А вот результат — заметьте, что на этот раз атрибуты не затронуты:
Mercury
.0553
58.65
1516
.983
43.4
Venus
.815
116.75
3716
.943
66.8
Earth
1
1
2107
1
128.4
Но есть более простой путь проверить, что копируются все дочерние узлы, атрибуты и другие потомки узлов: вместо элемента можно применить .
ГЛУБОКОЕ КОПИРОВАНИЕ
Пример использования для осуществления глубокого копирования документа будет приведен в главе 4, в которой описывается функция узла и объясняется, как рекурсивно вызывать один и тот же шаблон.
Элемент позволяет осуществлять глубокое копирование узлов, при котором копируется не только узел, но и все его атрибуты и потомки. У этого элемента единственный атрибут:
• select
(обязательный). Узел или набор копируемых узлов. Этот элемент пуст и не имеет содержимого.
Ниже приведен пример работы этого элемента; в этом случае я заменил в листинге 3.10 элемент элементом , который явно выбирает для копирования все атрибуты контекстного элемента.
Листинг 3.11. Применение
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Читать дальше