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 ответа

Решение

Вы можете "переназначить" (точнее, на тень) переменную, поскольку первая привязка находится на верхнем уровне таблицы стилей, а вторая - в шаблоне.

Из спецификации XSLT 1.0:

Привязка скрывает другую привязку, если привязка происходит в точке, где видна другая привязка, и привязки имеют то же имя. Ошибка, если привязка установлена 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 переменная, но это только вопрос определения.

Другие вопросы по тегам