>
А вот результирующий документ (отметьте, что я сохранил только элементы
и
):
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">
The Planets Table
The Planets Table
Name
Mass
Radius
Day
(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">