xsl: уточнение назначения переменных - PullRequest
0 голосов
/ 16 февраля 2019

Насколько я понимаю, <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 ]

0 голосов
/ 16 февраля 2019

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

From XSLT 1.0 спецификация :

привязка shadows другая привязка, если привязка происходит в точке, где видна другая привязка, и привязки имеют то же самоеназвание.Ошибка, если привязка, установленная элементом xsl:variable или xsl:param в шаблоне, скрывает другую привязку, установленную элементом xsl:variable или xsl:param также внутри шаблона.Не является ошибкой, если привязка, установленная элементом xsl:variable или xsl:param в шаблоне, скрывает другую привязку, установленную элементом верхнего уровня xsl:variable или xsl:param.

0 голосов
/ 16 февраля 2019

Насколько я понимаю, это неизменно и не может быть переназначено.

Это предположение верно.XSLT - это функциональный язык , и в этом типе языка часто встречаются неизменяемые переменные.

Почему я могу "переназначить" temp?

Причина, по которой это происходит, определяется термином Scope .Это означает, что ваше второе определение переменной temp переопределяет / накладывает ваше первое определение, если вы не оставите его область действия, которая - здесь - шаблон.Но здесь (как упомянуто в комментариях @ michael.hor257k) область действия может быть только для всей таблицы стилей или для шаблона - поэтому переопределение переменной в том же xsl:template - даже в другом блоке кода - запрещено.

Единственный способ убедить меня в том, что я не получаю сообщение об ошибке и почему temp выдаст false, - это наличие глобальной временной переменной И локальной временной переменной

На самом деле обе переменные являются локальными, но на другом уровне.Первое определение на уровне xsl:stylesheet, а второе на уровне xsl:template.Первую можно считать global переменной, но это только вопрос определения.

...