xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.
.
.
Теперь для проверки в цикле того, что текущий элемент не является контекстным узлом, я могу обратиться к контекстному узлу шаблона как $contextnode
(листинг 9.2).
Листинг 9.2. Хранение в переменной информации, зависимой от контекста
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Теперь наша проблема решена.
Если у элемента есть тело, он создает переменную, чье значение является фрагментом результирующего дерева. В следующем примере при помощи фрагмента результирующего дерева я задаю значение по умолчанию для атрибута COLOR
(цвет), если значение для него уже не задано. Значение по умолчанию я устанавливаю в « blue
» (голубой):
blue
Строковое значение фрагмента результирующего дерева (то есть либо значение атрибута COLOR
, либо значение по умолчанию, « blue
») присваивается переменной COLOR
. Теперь в выражениях XPath можно обращаться к значению этой переменной, $COLOR
, а не к значению атрибута ( @COLOR
, гарантированно получая при этом значение цвета, даже если у соответствующего элемента отсутствует атрибут COLOR
.
Вот еще один пример фрагмента результирующего дерева. В этом случае я сохраняю элемент буквального результата в переменной START_HTML
:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
My page
.
.
.
Теперь я могу использовать этот элемент буквального результата где угодно:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
My page
Welcome to my page
И вот результат:
My page
Welcome to my page
Однако поскольку теперь фрагменты результирующего дерева не допускаются в XSLT 1.1, этот пример работать не будет. Как же тогда сохранить весь элемент буквального результата одновременно с возможностью простого вызова? Вы можете создать именованный шаблон.
Элемент : применение именованных шаблонов
У элемента есть атрибут name
, задающий имя шаблона. Предположим, у меня есть элемент буквального результата, состоящий из двух элементов
и двух элементов
HTML, при помощи которого я создаю в документах HTML вертикальный разделитель:
Тогда я могу создать шаблон с именем «separator» (разделитель), использующий этот элемент буквального результата:
Это именованный шаблон — для его создания нужно только присвоить имя атрибуту name элемента .
Заметьте, что этот шаблон не установлен для выбора чего-то конкретного. Для активизации шаблона необходимо вызвать его явно. Для этого служит элемент , обладающий только одним атрибутом:
• name
(обязательный). Имя вызываемого шаблона, устанавливается в QName
.
Следующий пример демонстрирует применение нашего шаблона «separator», для чего мне нужно было только вызвать его в соответствующих местах:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
|
|
|
|
Вот результат. Обратите внимание: элементы
и
были вставлены так, как требовалось:
The Planets Table
The Planets Table
Name |
Mass |
Radius |
Day |
Mercury |
.0553 (Earth = 1) |
1516 miles |
58.65 days |
Venus |
.815 (Earth = 1) |
3716 miles |
116.75 days |
Earth |
1 (Earth = 1) |
2107 miles |
1 days |
Результирующий документ показан на рис. 9.1.
Рис. 9.1.Вызов именованного шаблона
Таким образом, вы можете обращаться к элементу буквального результата по имени, легко помещая его в результирующий документ. Но это слишком статично — элемент буквального результата всегда один и тот же. Впрочем, как можно заметить, вызов именованного шаблона во многом похож на вызов подпрограммы в языке программирования. Так же, как вы передаете данные в подпрограмму, вы можете передать данные в именованные шаблоны при помощи параметров .
Элементы и : создание параметров
Параметры во многом похожи на переменные — за тем исключением, что они обычно используются вместе с именованными шаблонами. Параметры позволяют вам передать в шаблон какие-то значения. Параметры создаются элементом , обладающим двумя атрибутами:
Читать дальше