XSLT дает возможность использовать в стиле переменные. Переменные в XSLT довольно сильно отличаются от переменных в других языках программирования. Строго говоря, переменные в XSLT не являются переменными в том смысле, что их значение нельзя изменить. Они больше похожи на константы присутствующие во многих языках программирования.
Под переменной в XSLT понимается не более чем ассоциация (связь) между значением и именем. Объявление переменной в XSLT лишь связывает указанное в ней имя со значением указанного в ней выражения. Иными словами, объявление переменной есть создание ассоциации между объектом и именем. К этому объекту можно будет в последствии обратиться, указав его имя.
Итак, переменная это имя, связанное со значением. Для создания переменной (ее объявления, или лучше сказать, привязки) в XSLT используются два элемента: xsl:variable
и xsl:param
. Строго говоря, в XSLT помимо понятия переменных существует также понятие параметры. Переменные создаются с помощью элемента xsl:variable
, параметры – с помощью элемента xsl:param
. Однако различие между переменными и параметрами в XSLT не значительно и заключается лишь в том, что значение, присвоенное параметру, является лишь значением по умолчанию. Если в шаблоне используется параметр (элемент xsl:param
), то при вызове этого шаблона значение параметра можно переопределить, передав шаблону новое значение параметра, которое будет использоваться вместо значения по умолчанию. Подробнее этот момент рассмотрен ниже.
Элементы xsl:variable
и xsl:param
могут быть как элементами верхнего уровня, так и инструкциями. В первом случае они будут объявлять глобальные переменные, во втором – локальные. Подробнее об этом будет сказано ниже.
Синтаксис:
1 2 3 4 5 | <xsl:variable name = "строка" select = "XPath"> Инструкции или фиксированные конечные элементы </xsl:variable> |
или
1 2 3 4 5 | <xsl:param name = "строка" select = "XPath"> Инструкции или фиксированные конечные элементы </xsl:param> |
Как видно, синтаксис у этих элементов абсолютно одинаковый.
Атрибуты:
name
— обязательный атрибут, задает имя переменной. В дальнейшем использовать значение, присвоенное переменной, можно указав перед именем переменной символ$
(например, для переменнойname
–$name
). Имя переменной соответствует правилу расширенных имен, т.е. оно может иметь видname
илиprefix:name
. Следует учесть, что если префикс указан, обратиться к переменной в дальнейшем можно будет также только по префиксу и имени (естественно с символом$
в начале).select
— необязательный атрибут, задает выражение, значение которого присваивается переменной. Если атрибутselect
не определен, но при этом элементxsl:variable
илиxsl:param
содержит дочерние инструкции и фиксированные конечные элементы, то значением переменной будет так называемый фрагмент конечного дерева, полученный в результате выполнения содержимогоxsl:variable
илиxsl:param
. Если же атрибутselect
не определен, и сам элементxsl:variable
илиxsl:param
не содержит никаких инструкций и фиксированных конечных элементов, то значением переменной будет пустая строка. Следует также отметить, что атрибутselect
имеет приоритет над содержимым элементаxsl:variable
илиxsl:param
: если одновременно определен атрибутselect
и элементxsl:variable
илиxsl:param
содержит другие инструкции и фиксированные конечные элементы, то предпочтение будет отдано атрибутуselect
, и переменной будет присвоено значение содержащегося в нем выражения. Инструкции и фиксированные конечные элементы, содержащиеся вxsl:variable
илиxsl:param
в этом случае будут проигнорированы.
Область видимости переменных
Как уже отмечалось выше, переменные (как и параметры) могут быть глобальными и локальными. Глобальные переменные объявляются элементами верхнего уровня xsl:variable
и xsl:param
. Локальные переменные объявляются инструкциями xsl:variable
и xsl:param
(т.е. объявляются внутри шаблона). Локальные и глобальные переменные обладают разной областью видимости.
Областью видимости глобальной переменной является весь стиль целиком. Ее можно использовать в стиле где угодно, в том числе даже до ее объявления.
Областью видимости локальной переменной является ее родительский элемент, и обратиться к ней можно только после ее объявления. К элементу xsl:param
в этом случае предъявляется дополнительное требование: он обязательно должен быть первым дочерним элементом шаблона.
Переменная, как глобальная, так и локальная, не должна определяться через саму себя – явно или неявно.
Нельзя дважды определять переменную с одним и тем же именем. Однако из этого правила есть исключения:
- имена глобальных переменных могут совпадать только в том случае, если они имеют разный приоритет импорта. В этом случае переменная будет иметь значение, которое задано элементом
xsl:variable
со старшим приоритетом импорта; - допускается совпадение имен глобальной и локальной переменной. В этом случае в области видимости локальной переменной будет использоваться локальное значение, а в области видимости глобальной (за исключением локальной видимости) – глобальное значение. То есть локальная переменная как бы перекрывает значение глобальной в своей области видимости;
- имена локальных переменных могут совпадать только в том случае, если их области видимости не пересекаются.
Параметры
Параметры в XSLT практически полностью идентичны переменным. Все, что говорилось выше о переменных, полностью применимо к параметрам. Основное различие заключается в том, что значение, присвоенное параметру при инициализации, является его значением по умолчанию и может быть переопределено при вызове.
Для передачи шаблону нового значения параметра инструкция вызова шаблона должна содержать элемент xsl:with-param
. Синтаксис этого элемента полностью идентичен синтаксису элемента xsl:param
:
1 2 3 4 5 | <xsl:with-param name = "строка" select = "XPath"> Инструкции или фиксированные конечные элементы </xsl:with-param> |
При этом значение параметра, объявленного в шаблоне, выбирается в соответствии со следующими правилами:
- если в элементе, вызывающем шаблон, присутствует инструкция
xsl:with-param
, передающая новое значение этого параметра, в шаблоне будет использоваться это переданное значение; - если в элементе, вызывающем шаблон, инструкция
xsl:with-param
с соответствующим именем отсутствует, в шаблоне будет использоваться значение по умолчанию.
Элемент xsl:with-param
может использоваться только в качестве дочернего элемента xsl:call-template
и xsl:apply-templates
.