xsl: уточнение назначения переменных
Я понимаю, что <xsl:variable>
является неизменным и не может быть переназначен.
Я новичок в XSL и столкнулся с ситуацией, как в примере ниже.
<xsl:stylesheet>
<xsl:variable name="temp" select="true()"/>
<xsl:template name="example">
<xsl:variable name="temp" select="false()"/>
<p><xsl:value-of select="$temp"/></p>
</xsl:template>
</styleheet>
Я не нашел ничего определенного относительно того, почему это происходит. Единственный способ, которым я могу объяснить, что я не получаю ошибку и почему temp
будет выводить false
является то, что существует глобальный temp
переменная И местный temp
переменная (и как-то не сталкивающаяся).
Почему я могу "переназначить" temp
?
2 ответа
Вы можете "переназначить" (точнее, на тень) переменную, поскольку первая привязка находится на верхнем уровне таблицы стилей, а вторая - в шаблоне.
Привязка скрывает другую привязку, если привязка происходит в точке, где видна другая привязка, и привязки имеют то же имя. Ошибка, если привязка установлена
xsl:variable
или жеxsl:param
элемент в шаблоне затеняет другую привязку, установленнуюxsl:variable
или жеxsl:param
элемент также в шаблоне. Это не ошибка, если привязка установленаxsl:variable
или жеxsl:param
элемент в шаблоне затеняет другую привязку, установленнуюxsl:variable
или жеxsl:param
элемент верхнего уровня.
Насколько я понимаю, это неизменно и не может быть переназначено.
Это предположение верно. XSLT является функциональным языком, и неизменяемые переменные распространены в этом типе языка.
Почему я могу "переназначить" темп?
Причина, по которой это происходит, определяется термином Scope. Это означает, что ваше второе определение переменной temp
переопределяет / накладывает ваш первый - если вы не оставите его область действия, которая - здесь - шаблон. Но здесь (как упомянуто в комментариях @michael.hor257k) область действия может быть только для всей таблицы стилей или для шаблона - так что переопределение переменной в том же самом xsl:template
- даже в другом блоке кода - запрещено.
Единственный способ убедить меня в том, что я не получаю сообщение об ошибке и почему temp выдает false, - это наличие глобальной временной переменной И локальной временной переменной
На самом деле обе переменные являются локальными, но на другом уровне. Первое определение на xsl:stylesheet
уровень и второй на xsl:template
уровень. Первый можно считать global
переменная, но это только вопрос определения.