Если задать шаблону имя, его можно вызывать по этому имени при помощи элемента . Шаблон применяется при вызове, поэтому вместо того чтобы полагаться на обработку таблицы стилей, принятую в процессоре XSLT по умолчанию, вы можете явно задать, когда и какой шаблон нужно применять. Например, несколько шаблонов могут выбирать один и тот же набор узлов, и вам нужно выбрать из них один или несколько шаблонов, которые будут применены. Именованные шаблоны похожи на режимы, но дают вам больше возможностей управления.
При вызове шаблона можно настроить его работу при помощи параметров. Например, вам может понадобиться, чтобы текст в создаваемых шаблоном текстовых узлах был на определенном языке — таком как английский, немецкий или французский — и вы можете создать новый параметр с именем language
(язык). При вызове именованного шаблона, заданного для обработки этого параметра, вы можете установить язык в « en
», « de
» или « fr
» и затем вызвать шаблон при помощи элемента . В самом именованном шаблоне используемый им параметр language
объявляется при помощи элемента . После объявления параметра к его значению можно свободно обращаться как $language
и использовать его в выражениях XPath. В этой главе мы рассмотрим многочисленные примеры работы с параметрами.
Переменные во многом похожи на параметры, с тем лишь отличием, что они по-другому создаются. Параметры, как правило, используются в именованных шаблонах, в то время как переменные применяются более широко, в выражениях XPath любого вида. Как и в языках программирования, в переменных XSLT можно хранить значения и обращаться к ним позже. Но есть одна важная особенность: за исключением особых обстоятельств, вы не можете изменять значение, хранимое в переменной. (В связи с этим некоторые авторы, пишущие об XSLT, считают неправильным называть их переменными.)
Переменные удобны для хранения значений, создание которых занимает длительное время, но в таблице стилей они часто используются. Вместо того, чтобы каждый раз заново создавать эти значения, сохраните их в переменной и ссылайтесь на ее значение. Как и в случае с параметрами, для получения значения переменной добавьте префикс «$». Например, для переменной с именем sandwich
получить ее значение можно при помощи $sandwich
. Как и в параметрах, в переменных можно хранить данные всех четырех типов данных XPath. Переменные также имеет смысл применять для хранения значений, которые позже в шаблоне будут изменены. Например, «.» обычно ссылается на контекстный узел шаблона, но внутри элемента «.» ссылается на текущий обрабатываемый в элементе узел, а не на контекстный узел всего шаблона. Для того чтобы обратиться к контекстному узлу, перед входом в цикл сохраните его в переменной contextnode
и затем в теле цикла используйте это значение как $contextnode
.
Кроме четырех типов данных XPath мы также будем использовать тип данных, поддерживаемый в XSLT 1.0, но не в XSLT 1.1 — фрагменты результирующего дерева, которые создаются элементами или . Фрагменты результирующего дерева могут быть удобны в определенных случаях, как вы увидите далее в этой главе.
Наконец, в этой главе мы также рассмотрим элемент . Впервые он нам встретился в главе 4, теперь мы изучим его более подробно.
Для введения вполне достаточно; давайте перейдем к работе, и начнем мы с переменных.
Элемент : создание переменных
Для создания переменных в XSLT служит элемент , обладающий следующими атрибутами:
• name
(обязательный). Имя переменной, устанавливается в QName;
• select
(необязательный). Выражение XPath, задающее значение переменной. Если опустить этот атрибут, значение переменной будет определяться содержимым .
Этот элемент может либо быть элементом верхнего уровня, либо применяться внутри тела шаблона. Элемент может сам содержать тело шаблона, но в таком случае нельзя использовать атрибут select
.
Для создания переменной присвойте ее имя атрибуту name элемента , а значение переменной атрибуту select
, как в следующем примере, в котором я создаю переменную number_books
и сохраняю в ней значение 255:
.
.
.
Получить значение переменной можно, добавив к ее имени префикс $:
There are
books in my library
Заметьте, что если вы присваиваете переменной литерал — как, например, присваивание значения «turkey» (индейка) переменной sandwich
(бутерброд), — литерал необходимо заключить в кавычки, причем они должны отличаться от кавычек, в которые заключены значения атрибутов:
Читать дальше