Значения переменных и параметров
Элемент привязки переменной может указывать значение переменной тремя разными способами.
Если элемент привязки переменной имеет атрибут select, то значением этого атрибута должно быть , а значением самой переменной является объект, полученный в результате обработки этого выражения. Содержимое элемента в этом случае должно быть пустым.
Если элемент привязки переменной не имеет атрибута select, но имеет непустое содержание (иначе говоря, элемент привязки переменной имеет один или несколько узлов - непосредственных потомков), тогда требуемое значение задается содержимым элемента привязки переменной. Содержимое элемента привязки переменной является шаблоном, который обрабатывается для получения значения данной переменной. Этим значением является фрагмент конечного дерева, эквивалентный набору узлов, состоящему из одного корневого узла, который в качестве непосредственных потомков имеет последовательность узлов, полученных при обработке представленного шаблона. Базовым URI для узлов в рассматриваемом фрагменте конечного дерева является базовый URI элемента привязки переменной.
Если в последовательности узлов, полученной при обработке шаблона, появится узел атрибута или узел пространства имен, фиксируется ошибка, поскольку корневой узел не может иметь непосредственным потомком ни узел атрибута, ни узел пространства имен. XSLT процессор может сигнализировать о такой ошибке. Если он этого не делает, то должен обработать ее сам, не добавляя соответствующий узел атрибутов или пространства имен.
Если элемент привязки переменной имеет пустое содержание и не имеет атрибута select, значением переменной является пустая строка. Таким образом
<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="/.."/>