Повторно использовать переменную, определенную внутри выбора, вне выбора в XSLT - PullRequest
1 голос
/ 11 сентября 2009

У меня есть фрагмент кода, который выглядит примерно так:

<xsl:choose>
   <xsl:when test="some_test">   
      <xsl:value-of select="Something" />
      You are:
      <xsl:variable name="age">12</xsl:variable>
      years
   </xsl:when>
</xsl:choose>

Моя проблема в том, что я хотел бы использовать переменную $ age вне выбора.Как мне это сделать?

Аналогичная проблема заключается в том, что у меня есть несколько шаблонов в моем XSLT-файле, и один из них является основным шаблоном.Вот этот:

<xsl:template match="/">
</xsl:template>

Внутри этого шаблона я вызываю несколько других шаблонов, и снова я бы хотел использовать некоторые переменные из других шаблонов.

Например, если яесть этот код:

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

<xsl:template name="search">
   <xsl:variable name="searchVar">Something...</xsl:variable>
</xsl:template>

Тогда я бы хотел использовать $ searchVar внутри моего основного шаблона.

Это вроде та же проблема, я думаю, но я не могу показатьсячтобы понять это.

И, кстати, я запускаю Umbraco в качестве моей CMS:)

Я надеюсь, что некоторые из вас ответят.1022 *

Ответы [ 2 ]

2 голосов
/ 11 сентября 2009

К # 1: переменные действительны только в пределах родительского элемента. Это означает, что вы должны поместить логику внутри в переменную вместо "вокруг":

<xsl:variable name="var">
  <xsl:choose>
    <xsl:when test="some_test">
      <xsl:text>HEY!</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>SEE YA!</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

Кому # 2: использовать параметры для переноса значений в шаблоны.

<xsl:template match="/">
  <xsl:variable name="var" select="'something'" />

  <!-- params work for named templates.. -->
  <xsl:call-template name="search">
    <xsl:with-param name="p" select="$var" />
  </xsl:call-template>

  <!-- ...and for normal templates as well -->
  <xsl:apply-templates select="xpath/to/nodes">
    <xsl:with-param name="p" select="$var" />
  </xsl:apply-templates>
</xsl:template>

<!-- named template -->
<xsl:template name="search">
  <xsl:param name="p" />

  <!-- does stuff with $p -->
</xsl:template>

<-- normal template -->
<xsl:template match="nodes">
  <xsl:param name="p" />

  <!-- does stuff with $p -->
</xsl:template>

Чтобы перенести значение обратно в вызывающий шаблон, объедините вышеперечисленное:

<xsl:template match="/">
  <xsl:variable name="var">
    <xsl:call-template name="age">
      <xsl:with-param name="num" select="28" />
    </xsl:call-template>
  </xsl:variable>

  <xsl:value-of select="$var" />
</xsl:template>

<xsl:template name="age">
  <xsl:param name="num" />

  <xsl:value-of select="concat('You are ', $num, ' years yold!')" />
</xsl:template>
0 голосов
/ 11 сентября 2009

Посмотрите на xsl: param .

Редактировать : Не проверено, но может работать:

<xsl:param name="var">
  <xsl:choose>
   <xsl:when test="some_test">   
     <xsl:value-of select="string('HEY!')" />
   </xsl:when>
  </xsl:choose>
</xsl:param>
...