Переменные

Переменные

Переменные вызываются в выражениях XPath по своему имени, которому предшествует символ "$". Например, если мы объявили переменную nodes:

<xsl:variable name="nodes" select="a/b"/>

то использовать в выражениях мы ее будем как $nodes.

Переменные, так же как элементы и атрибуты XML, могут иметь расширенные имена вида QName, состоящие из префикса пространства имен и локальной части имени. Это позволяет создавать переменные, принадлежащие различным пространствам имен.

Пример

Мы можем определить две переменные с одинаковыми локальными частями имен в разных пространствах, используя при определении имени префикс. Естественно, префикс должен быть заранее связан с URI пространства имен.

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 xmlns:a="uri:a"

 xmlns:b="uri:b">

 <xsl:variable name="a:elementcount" select="count(//a:*)"/>

 <xsl:variable name="b:elementcount" select="count(//b:*)"/>

 ...

</xsl:stylesheet>

В этом преобразовании количество элементов документа, принадлежащих пространству имен а, будет содержаться в переменной a:elementcount, а пространству имен b — в переменной b:elementcount.

Отсутствие префикса в XPath-выражениях не означает, что следует использовать префикс по умолчанию. Отсутствие префикса означает, что префикс является нулевым со всеми вытекающими последствиями. Например, если шаблон

<xsl:template match="counts">

 <xsl:value-of select="$a:elementcount"/>

 <xsl:text>&#xA;</xsl:text>

 <xsl:value-of select="$b:elementcount"/>

</xsl:template>

будет корректен, в шаблоне

<xsl:template match="counts" xmlns="uri:a">

 <xsl:value-of select="$elementcount"/>

 <xsl:text>&#xA;</xsl:text>

 <xsl:value-of select="$b:elementcount"/>

</xsl:template>

процессор не сможет найти объявление переменной $elementcount, потому что расширенное имя объявленной переменной состоит из URI пространства имен "uri:а" и локальной части имени elementcount, а расширенное имя переменной elementcount состоит из нулевого URI и локальной части elementcount. Иными словами, эти переменные принадлежат разным пространствам.