действует то же правило, что и во многих других языках программирования: нельзя дважды определять переменную с один и тем же именем. Однако и тут есть свои особенности.
□ Имена двух глобальных переменных могут совпадать в том и только том случае, когда они имеют разный порядок импорта. Например, если переменные с одинаковыми именами определены в разных преобразованиях, одно из них может быть импортировано. В этом случае переменная будет иметь значение, которое задано элементом
xsl:variable
со старшим порядком импорта.
□ Допускается совпадение имен локальной и глобальной переменных — в этом случае в области видимости локальной переменной будет использоваться локальное значение, в области видимости глобальной (но не локальной) — глобальное значение. Иными словами, локальные переменные "закрывают" значения глобальных.
□ Две локальные переменные могут иметь совпадающие имена в том и только том случае, если их области видимости не пересекаются.
Первое правило мы уже упоминали, когда разбирали порядок импорта: тогда мы сказали, что переменные со старшим порядком импорта переопределяют переменные с младшим порядком импорта. Это довольно важное обстоятельство, поскольку оно добавляет некоторые интересные возможности, но при этом также может породить скрытые ошибки.
Пример
Предположим, что в следующем преобразовании в шаблоне с именем
choice
мы генерируем два элемента
input
.
Листинг 5.24. Преобразование en.xsl
<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"/>
Для того чтобы перевести надписи на этих кнопках на другой язык достаточно просто переопределить переменные. Например, результатом выполнения следующего шаблона.
Листинг 5.25. Преобразование de.xsl
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="#"/>
<xsl:variable name="submit" select="'Senden'"/>
<xsl:variable name="reset" select="'Loeschen'"/>
</xsl:stylesheet>
будет тот же фрагмент, но уже на немецком языке:
<input type="button" value="Senden"/>
<input type="reset" value="Loeschen"/>
С другой стороны, переопределение переменных может быть и опасным: в случае, если отдельные модули разрабатывались независимо, совпадение имен глобальных переменных может привести к ошибкам. Для того чтобы такое было в принципе исключено, имя переменной следует объявлять в определенном пространстве имен, например:
<xsl:variable name="app:href" select="..."/>
<xsl:variable name="db:href" select="..."/>
В том случае, если префиксы
app
и
db
(которые, конечно же, должны быть объявлены) будут указывать на разные пространства имен, никакого конфликта между этими двумя переменными не будет.
Возвращаясь к теме совпадений имен переменных, продемонстрируем "скрытие" локальной переменной значения глобальной: