Speak.Me Учить иностранные слова

XSL: переменные и параметры (xsl:variable и xsl:param)

XSLT дает возможность использовать в стиле переменные. Переменные в XSLT довольно сильно отличаются от переменных в других языках программирования. Строго говоря, переменные в XSLT не являются переменными в том смысле, что их значение нельзя изменить. Они больше похожи на константы присутствующие во многих языках программирования.

Под переменной в XSLT понимается не более чем ассоциация (связь) между значением и именем. Объявление переменной в XSLT лишь связывает указанное в ней имя со значением указанного в ней выражения. Иными словами, объявление переменной есть создание ассоциации между объектом и именем. К этому объекту можно будет в последствии обратиться, указав его имя.

Итак, переменная это имя, связанное со значением. Для создания переменной (ее объявления, или лучше сказать, привязки) в XSLT используются два элемента: xsl:variable и xsl:param. Строго говоря, в XSLT помимо понятия переменных существует также понятие параметры. Переменные создаются с помощью элемента xsl:variable, параметры – с помощью элемента xsl:param. Однако различие между переменными и параметрами в XSLT не значительно и заключается лишь в том, что значение, присвоенное параметру, является лишь значением по умолчанию. Если в шаблоне используется параметр (элемент xsl:param), то при вызове этого шаблона значение параметра можно переопределить, передав шаблону новое значение параметра, которое будет использоваться вместо значения по умолчанию. Подробнее этот момент рассмотрен ниже.

Элементы xsl:variable и 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:

При этом значение параметра, объявленного в шаблоне, выбирается в соответствии со следующими правилами:

  • если в элементе, вызывающем шаблон, присутствует инструкция xsl:with-param, передающая новое значение этого параметра, в шаблоне будет использоваться это переданное значение;
  • если в элементе, вызывающем шаблон, инструкция xsl:with-param с соответствующим именем отсутствует, в шаблоне будет использоваться значение по умолчанию.

Элемент xsl:with-param может использоваться только в качестве дочернего элемента xsl:call-template и xsl:apply-templates.