Элемент <xsl:param>
Определяет именованный параметр для использования с элементами <xsl:stylesheet> или <xsl:template>. Позволяет задать значение по умолчанию.
<xsl:param
name = QName
select = Expression
</xsl:param>
Атрибуты
имя
Обязательный. Задает имя Полные имена (XSLT) параметра.select
Значение атрибута равно Выражения (XSLT), а значение переменной равно объекту, получаемому при вычислении выражения. При использовании этого атрибута элемент <xsl:param> должен быть пустым.
Сведения об элементе
Количество вхождений |
Без ограничений |
Родительские элементы |
|
Дочерние элементы |
xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, элементы вывода |
Заметки
Значение, заданное для элемента <xsl:param>, используется по умолчанию для связывания. При вызове шаблона или таблицы стилей с элементом <xsl:param> передаются параметры, используемые вместо величин по умолчанию.
Элемент <xsl:param> должен быть объявлен как непосредственный дочерний для элемента <xsl:template>. В противном случае значение элемента <xsl:param> будет недоступно, и произойдет ошибка. Например:
<xsl:template name="getcount">
<xsl:element name="strong">
<xsl:param name="counted">
<xsl:value-of select="count(//book)"/>
</xsl:param>
Total Book Count: <xsl:value-of select="$counted"/>
</xsl:element>
</xsl:template>
В предыдущем примере единственным непосредственным дочерним элементом для <xsl:template> является <strong>. Поэтому синтаксический анализатор не может правильно вычислить значение элемента <xsl:param>, и будет выдано следующее сообщение об ошибке:
Примечание
Здесь нельзя использовать ключевое слово xsl:param.
Правильно расположить этот элемент, чтобы его можно было вычислить в контексте элемента <xsl:template>, нужно следующим образом:
<xsl:template name="getcount">
<xsl:param name="counted">
<xsl:value-of select="count(//book)"/>
</xsl:param>
<xsl:element name="strong">
Total Book Count: <xsl:value-of select="$counted"/>
</xsl:element>
Значение параметра может быть объектом любого типа, который может быть возвращен выражением. Элемент <xsl:param> может определять значение переменной тремя нижеперечисленными альтернативными способами.
Если у элемента есть атрибут select, значение этого атрибута должно быть выражением, а значение параметра представляет собой объект, получаемый при вычислении выражения. В этом случае содержимое элемента должно быть пустым.
Если элемент не имеет атрибута select, а его содержимое непустое, например имеется несколько дочерних узлов, содержимое и определяет значение. Содержимым является шаблон, экземпляр которого создается для получения значения параметра. Значение представляет собой фрагмент результирующего дерева, эквивалентный набору узлов, содержащему единственный корневой узел, последовательность дочерних узлов которого порождена в соответствии с шаблоном. Базовый URI-идентификатор узлов результирующего фрагмента дерева является базовым URI-идентификатором элемента.
Если член последовательности узлов, созданных в соответствии с шаблоном, является атрибутом или пространством имен, возникает ошибка, поскольку корневой узел не может содержать в качестве дочерних узлов атрибуты и пространства имен.
Если содержимое пусто и не имеет атрибута select, значением параметра будет пустая строка. Так,
<xsl:param name="x"/>
эквивалентно
<xsl:param name="x" select="''"/>
Если параметр используется для выбора узлов в зависимости от их расположения, не следует использовать следующую конструкцию:
<xsl:param name="n">2</xsl:param> ... <xsl:value-of select="item[$n]"/>
При этом будет выведено значение первого элемента, поскольку переменная n будет связана с фрагментом результирующего дерева, а не числом. Вместо этого используйте либо инструкцию
<xsl:param name="n" select="2"/> ... <xsl:value-of select="item[$n]"/>
или
<xsl:param name="n">2</xsl:param> ... <xsl:value-of select="item[number($n)]"/>
Далее показан удобный способ задать пустой набор узлов как значение параметра по умолчанию. <xsl:param name="x" select="/.."/>
Пример
В этом примере определяется именованный шаблон для «нумерованного блока» с аргументом, задающим формат числа.
XML-файл (catmat.xml)
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="paramelem.xsl"?>
<lists>
<ol>
<li>the</li>
<li>cat</li>
<ol>
<li>sat</li>
<li>on</li>
<li>the</li>
</ol>
<li>mat</li>
</ol>
</lists>
XSLT-файл (paramelem.xsl)
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="paramelem.xsl"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="ol/li">
<br/>
<xsl:call-template name="numbered-block"/>
</xsl:template>
<xsl:template match="ol//ol/li">
<br/>   
<xsl:call-template name="numbered-block">
<xsl:with-param name="format">a. </xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="numbered-block">
<xsl:param name="format">1. </xsl:param>
<fo:block>
<xsl:number format="{$format}"/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
</xsl:stylesheet>
Вывод
Далее приведен форматированный вывод.
1. the 2. cat a. sat b. on c. the 3. mat
Далее приведен вывод обработчика. Пробелы добавлены для наглядности.
<?xml version="1.0" encoding="UTF-16"?>
<br xmlns:fo="http://www.w3.org/1999/XSL/Format" />
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">1. the</fo:block>
<br xmlns:fo="http://www.w3.org/1999/XSL/Format" />
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">2. cat</fo:block>
<br xmlns:fo="http://www.w3.org/1999/XSL/Format" />
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">a. sat</fo:block>
<br xmlns:fo="http://www.w3.org/1999/XSL/Format" />
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">b. on</fo:block>
<br xmlns:fo="http://www.w3.org/1999/XSL/Format" />
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">c. the</fo:block>
<br xmlns:fo="http://www.w3.org/1999/XSL/Format" />
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">3. mat</fo:block>