<xsl:variable name='x'/>
равнозначно
<xsl:variable name='x' select=''''/>
Замечание: Если переменная используется для нахождения узла по номеру позиции, то не следует делать следующего:
<xsl:variable name='n'>2</xsl:variable> … <xsl:value-of select='item[$n]'/>
Результатом будет значение первого элемента item, поскольку переменная n будет привязана к фрагменту конечного дерева, а не к числу. Вместо этого делайте либо
<xsl:variable name='n' select='2'/> … <xsl:value-of select='item[$n]'/>
либо
<xsl:variable name='n'>2</xsl:variable> … <xsl:value-of select='item[position()= $n]'/>
Замечание: Удобный прием, позволяющий задать пустой набор узлов в качестве значение по умолчанию для параметра:
<xsl:param name='x' select='/..'/>
11.3 Использование значений переменных и параметров с конструкцией xsl:copy-of
<!– Category: instruction ->
<xsl:copy-of
select = expression />
Чтобы вставить фрагмент конечного дерева в конечное дерево без предварительного преобразования в строку, как это делает xsl:value-of (см. [7.6.1 Создание текста с помощью xsl:value- of]), можно использовать элемент xsl:copy-of . Обязательный атрибут select содержит выражение. Если результатом обработки выражения является фрагмент конечного дерева, то этот фрагмент целиком копируется в конечное дерево. Если же результатом является набор узлов, в конечное дерево копируются все узлы этого набора и в том порядке, как они были в документе. Когда копируется узел элемента, вместе с самим узлом элемента копируются также узлы атрибутов, узлы пространства имён и непосредственные потомки этого узла элемента. Копирование корневого узла выполняется копированием его непосредственных потомков. Если результат не является ни набором узлов, ни фрагментом конечного дерева, то он преобразуется в строку, а затем помещается в конечное дерево, как при использовании xsl:value-of.
11.4 Переменные и параметры верхнего уровня
И xsl:variable, и xsl:param можно использовать в элементах верхнего уровня. Элемент привязки переменной на верхнем уровне декларирует глобальную переменную, которая видна отовсюду. Элемент верхнего уровня xsl:param декларирует параметр для стиля, однако XSLT не определяет механизм передачи параметров стилю. Если стиль содержит привязку для нескольких переменных верхнего уровня с одним и тем же именем и одинаковым приоритетом импорта, фиксируется ошибка. На верхнем уровне выражение или шаблон, указывающие значение переменной, обрабатываются с тем же контекстом, что и при обработке корневого узла в исходном документе: текущим узлом является корневой узел исходного документа, а текущим набором узлов – список, содержащий только корневой узел исходного документа. Если шаблон или выражение, определяющее значение глобальной переменной x, ссылается на глобальную переменную y, то значение y должны быть вычислено прежде значения x. Если это можно сделать не для всех глобальных деклараций переменных, фиксируется ошибка. Иными словами, фиксируется ошибка, если декларации зацикливаются.
Данный пример декларирует глобальную переменную para-font-size , с помощью которой в шаблоне значения атрибута делается ссылка.
<xsl:variable name='para-font-size'>12pt</xsl:variable>
<xsl:template match='para'>
<fo:block font-size='{$para-font-size}'>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
11.5 Переменные и параметры в шаблонах
Помимо верхнего уровня, и xsl:variable, и xsl:param можно использовать также в шаблонах. xsl:variable можно ставить в любом месте шаблона, где допустимо использование инструкций. В этом случае, данная привязка видна для всех последующих узлов, имеющих того же родителя и их потомков. Заметим однако, что привязка для самого элемента xsl:variable не видна. xsl:param можно использовать как непосредственный потомок в начале элемента xsl:template. В данном контексте привязка переменной видна для всех