j
<xsl:stylesheet <xsl:stylesheet
version='1.0' xmlns:xsl='... '> version='1.0' xmlns:xsl='... '>
<xsl:template match='/'> <xsl:template match='/'>
<xsl:variable name='i' <xsl:variable name='i'
select='2'/> select='2'/>
<xsl:variable name='j' <xsl:variable name='j'
select='$i - 1'/> select='$i - 1'/>
<xsl:if test='$i > $j'> <xsl:if test='$i > $j'>
<xsl:variable name='k'> <xsl:variable name='k'>
<xsl:value-of select='$i'/> <xsl:value-of select='$i'/>
<xsl:value-of select='$gt'/> <xsl:value-of select='$gt'/>
<xsl:value-of select='$j'/> <xsl:value-of select='$j'/>
</xsl:variable> </xsl:variable>
<result> <result>
<xsl:copy-of select='$k'/> <xsl:copy-of select='$k'/>
</result> </result>
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
<xsl:variable name='gt'> <xsl:variable name='gt'>
is greater than is greater than
</xsl:variable> </xsl:variable>
</xsl:stylesheet> </xsl:stylesheet>
Область видимости переменной k Область видимости переменной gt
<xsl:stylesheet <xsl:stylesheet
version='1.0' xmlns:xsl='... '> version='1.0' xmlns:xsl='... '>
<xsl:template match='/'> <xsl:template match='/'>
<xsl:variable name='i' <xsl:variable name='i'
select='2'/> select='2'/>
<xsl:variable name='j' <xsl:variable name='j'
select='$i - 1'/> select='$i - 1'/>
<xsl:if test='$i > $j'> <xsl:if test='$i > $j'>
<xsl:variable name='k'> <xsl:variable name='k'>
<xsl:value-of select='$i'/> <xsl:value-of select='$i'/>
<xsl:value-of select='$gt'/> <xsl:value-of select='$gt'/>
<xsl:value-of select='$j'/> <xsl:value-of select='$j'/>
</xsl:variable> </xsl:variable>
<result> <result>
<xsl:copy-of select='$k'/> <xsl:copy-of select='$k'/>
</result> </result>
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
<xsl:variable name='gt'> <xsl:variable name='gt'>
is greater than is greater than
</xsl:variable> </xsl:variable>
</xsl:stylesheet> </xsl:stylesheet>
В XSLT действует то же правило, что и во многих других языках программирования: нельзя дважды определять переменную с один и тем же именем. Однако и тут есть свои особенности.
□ Имена двух глобальных переменных могут совпадать в том и только том случае, когда они имеют разный порядок импорта. Например, если переменные с одинаковыми именами определены в разных преобразованиях, одно из них может быть импортировано. В этом случае переменная будет иметь значение, которое задано элементом xsl:variable со старшим порядком импорта.
□ Допускается совпадение имен локальной и глобальной переменных — в этом случае в области видимости локальной переменной будет использоваться локальное значение, в области видимости глобальной (но не локальной) — глобальное значение. Иными словами, локальные переменные 'закрывают' значения глобальных.
□ Две локальные переменные могут иметь совпадающие имена в том и только том случае, если их области видимости не пересекаются.
Первое правило мы уже упоминали, когда разбирали порядок импорта: тогда мы сказали, что переменные со старшим порядком импорта переопределяют переменные с младшим порядком импорта. Это довольно важное обстоятельство, поскольку оно добавляет некоторые интересные возможности, но при этом также может породить скрытые ошибки.
Предположим, что в следующем преобразовании в шаблоне с именем choice мы генерируем два элемента input.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:variable name='submit' select=''Submit''/>
<xsl:variable name='reset' select=''Reset''/>
<xsl:template name='choice'>
<input type='button' value='{$submit}'/>
<xsl:text>
</xsl: text>
<input type='reset' value='{$reset}'/>
</xsl:template>
<xsl:template match='/'>
<xsl:call-template name='choice'/>
</xsl:template>
</xsl:stylesheet>
Результатом этого преобразования будет следующий фрагмент:
<input type='button' value='Submit'/>
<input type='reset' value='Reset'/>
Для того чтобы перевести надписи на этих кнопках на другой язык достаточно просто переопределить переменные. Например, результатом выполнения следующего шаблона.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:import href='en.xsl'/>
<xsl:variable name='submit' select=''Senden''/>
<xsl:variable name='reset' select=''Loeschen''/>
