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.

