переинициализация переменной xslt - PullRequest
1 голос
/ 13 сентября 2011

У меня есть переменная:

<xsl:variable name="code" select="F2"/>

могу ли я переинициализировать его где-нибудь еще в моем коде? возможно ли это?
Мне нужно сохранить в нем текущий узел и определить, отклонен ли он или передан.

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

Как только вы установили значение переменной, вы не можете изменить или изменить это значение!

Ссылка: http://www.w3schools.com/xsl/el_variable.asp

2 голосов
/ 13 сентября 2011

XSLT - это функциональный язык. В функциональных языках переменные, однажды заданные значения, не могут быть изменены .

Можно добиться того же эффекта, что и при изменении переменной, используя xsl:param в шаблоне и передавая в новом вызове шаблона новое значение для этого параметра.

Вот краткий и полный пример :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="nums">
  <xsl:call-template name="sum"/>
 </xsl:template>

 <xsl:template name="sum">
  <xsl:param name="pList" select="*"/>
  <xsl:param name="pAccum" select="0"/>

  <xsl:choose>
   <xsl:when test="not($pList)">
    <xsl:value-of select="$pAccum"/>
   </xsl:when>
   <xsl:otherwise>
     <xsl:call-template name="sum">
      <xsl:with-param name="pList"
           select="$pList[position() > 1]"/>
       <xsl:with-param name="pAccum" select="$pAccum+$pList[1]"/>
     </xsl:call-template>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к этому документу XML :

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

получен правильный результат :

55

Обратите внимание , как параметры «модифицируются»:)

2 голосов
/ 13 сентября 2011

xsl: переменные не могут быть переназначены «явно», хотя их область действия ограничена текущей конструкцией (например, xsl: template или xsl: for-each), и поэтому будет «переинициализирована» при переходе к следующей 'каждый'.

xsl: переменные могут указывать на узел, т.е.

<xsl:variable name="someNodeVar" select="xpathToElement"/>

, а затем использовать, например,

<xsl:value-of select="$someNodeVar/relativeXpathGoesHere/text()"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...