<xsl:param> XSLT

Элемент xsl:template, задающий в преобразовании шаблонное правило, может включать несколько элементов xsl:param, которые и будут определять параметры этого шаблона.

Кроме этого, xsl:param может указываться в виде элемента верхнего уровня — в этом случае он будет определять глобальный параметр. В XSLT 2.0 элемент <xsl:param> также может находиться в новом элементе <xsl:function>.

Элементы-родители:

Синтаксис

XSLT 1.0

<xsl:param
    name = "строка"
    select = "выражение" >
    <!-- Содержимое: шаблон -->
</xsl:param>

Атрибуты

  • nameобязательный атрибут, задает имя параметра
  • selectнеобязательный атрибут. Параметру может быть присвоено значение по умолчанию — то есть значение, которое будет использоваться в случае, если параметра с таким именем шаблону передано не было. Значение по умолчанию вычисляется следующим образом:
    • если в элементе xsl:param определен атрибут select, то значением по умолчанию будет результат вычисления выражения, указанного в этом атрибуте;
    • если атрибут select не определен, но сам элемент xsl:param имеет дочерние узлы, то значением определяемого параметра по умолчанию будет фрагмент дерева, полученного в результате выполнения содержимого xsl:param;
    • если атрибут select не определен и при этом сам элемент xsl:param пуст, то значением параметра по умолчанию будет пустая строка.

Спецификация

XSLT 2.0

<xsl:param
    name = "qname"
    select = "expression"
    as = "sequence-type"
    required = "yes | no"
    tunnel = "yes | no">
    <!-- Содержимое: sequence-constructor -->
</xsl:param>

Атрибуты

  • nameобязательный атрибут, определяет имя параметра.
  • selectнеобязательный атрибут, содержит выражение XPath, определяющее значение параметра.
  • asнеобязательный атрибут, определяет тип данных параметра. Им может быть любой из встроенных типов данных или же тип данных, определенный в схеме, если вы используете схемосовместимый процессор XSLT 2.0. Например, as="xs:integer" задает параметр, который является целым числом, а as="xs:string*" – параметр, который является последовательностью из нуля или более строк. При использовании схемосовместимого процессора XSLT запись as="schema-element(po:purchase-order)" означает, что параметр должен быть экземпляром `po:purchase-order, прошедшим проверку на действительность.
  • requiredнеобязательный атрибут, определяет, является ли параметр обязательным. Допустимые значения: yes и no. Если параметр принадлежит <xsl:function>, этот атрибут не должен определяться. Для параметров шаблонов и таблиц стилей по умолчанию параметр не является обязательным (required="no"). Наличие атрибута required одновременно со значением по умолчанию у <xsl:param> является статической ошибкой. Обязательные параметры не могут иметь атрибута select, и они должны быть пустыми. Использование атрибута required для параметра, определяемого в элементе <xsl:function>, также является статической ошибкой.
  • tunnelнеобязательный атрибут, определяет, является ли параметр туннельным. Допустимые значения: yes и no; по умолчанию используется значение no. Туннельные параметры подробно рассматриваются в статье туннельные параметры.

XSLT 3.0

<xsl:param
    name = eqname
    select? = expression
    as? = sequence-type
    required? = boolean
    tunnel? = boolean
    static? = boolean >
    <!-- Content: sequence-constructor -->
</xsl:param>

Описание и примеры

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

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

Работа с параметрами обеспечивается двумя элементами — xsl:param, который объявляет в шаблоне новый параметр и xsl:with-param, который указывает значение параметра при вызове шаблона.

Примеры

Элемент

<xsl:param name="x" select="2 * 2"/>

создаст параметр, значением которого по умолчанию будет 4. Точно такой же эффект будет иметь элемент

<xsl:param name="x" select="2 * 2">
    <xsl:value-of select="5 * 5/>
</xsl:param>

Его содержимое не будет приниматься в расчет, поскольку в xsl:param присутствует атрибут select. Если же убрать атрибут select:

<xsl:param name="x">
    <xsl:value-of select="5 * 5/>
</xsl:param>

то значение параметра x по умолчанию действительно будет результатом вычисления его содержимого. Однако, вопреки довольно здравому разумению, этим значением не будет число 25 и даже не строка “25” и тем более не множество, состоящее из текстового узла со значением 25. Значением параметра x по умолчанию будет результирующий фрагмент дерева, корень которого будет иметь единственный текстовый узел со значением “25” (рис. 5.3).

Рис. 5.3. Фрагмент дерева, который будет значением параметра x по умолчанию

Рис. 5.3. Фрагмент дерева, который будет значением параметра x по умолчанию
Рис. 5.3. Фрагмент дерева, который будет значением параметра x по умолчанию

Не стоит пугаться такой структуры в качестве значения параметра. То, что параметр x вдруг будет содержать дерево, ничуть не ограничивает его использование, ведь дерево при потребности может быть приведено к числу или к строке; к множеству узлов же не может быть приведен ни один тип данных.

Предупреждение. Напомним, что при приведении дерева к булевому типу, результатом всегда будет истина. Дерево всегда содержит как минимум корневой узел, и поэтому оно никогда не будет считаться пустым.

Определение параметра вида:

<xsl:param name="x"/>

то есть когда в нем нет ни атрибута select, ни содержимого, присвоит параметру пустую строку, то есть будет эквивалентно

<xsl:param name="x" select="''"/>

Точно так же, как и в случае с переменными, значение заданного в шаблоне параметра можно использовать в выражениях, добавляя перед именем параметра префикс “$”. К примеру, значение нашего параметра x может быть получено конструкцией вида $x.

Для того чтобы передать в шаблон определенные значения параметров, элементы, которые вызывают этот шаблон, должны содержать один или несколько элементов xsl:with-param, который мы рассмотрим чуть ниже. Глобальные параметры, объявленные элементами xsl:param верхнего уровня, также могут быть переданы преобразованию, однако конкретный механизм реализации этой передачи целиком и полностью зависит от реализации конкретного процессора.

Область видимости параметров

Область видимости параметров определяется в точности так же, как область видимости переменных. Единственным, на что следует обратить здесь внимание — это то, что элементы xsl:param, определяемые в шаблонах, должны всегда быть его первыми дочерними элементами. Поэтому область видимости локальных параметров определяется несколько легче, чем область видимости локальных переменных: после определения параметр может использоваться в том шаблоне где угодно.

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

См. также

Ссылки

MDN xsl:param на MDN
MSDN xsl:param на MSDN