Riutilizza la variabile definita all'interno di Scegli, al di fuori di Scegli in XSLT

StackOverflow https://stackoverflow.com/questions/1410069

  •  05-07-2019
  •  | 
  •  

Domanda

Ho un pezzo di codice simile a questo:

<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>

Il mio problema è che vorrei utilizzare la variabile $ age al di fuori della scelta. Come posso farlo?

Un problema simile è che ho diversi modelli nel mio file XSLT, e uno di questi è il modello principale. Questo:

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

All'interno di questo modello, chiamo diversi altri modelli e, di nuovo, vorrei utilizzare alcune delle variabili degli altri modelli.

Ad esempio, se ho questo codice:

<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>

Quindi vorrei usare $ searchVar all'interno del mio template principale.

Penso sia lo stesso problema, ma non riesco a capirlo.

E io eseguo Umbraco come mio CMS tra l'altro :)

Spero che alcuni di voi abbiano la risposta.

Grazie - Kim

È stato utile?

Soluzione

A # 1: le variabili sono valide solo all'interno del loro elemento genitore. Ciò significa che devi inserire la logica dentro la variabile invece di " around " esso:

<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>

Al n. 2: utilizzare i parametri per trasportare i valori nei modelli.

<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>

Per riportare un valore nel modello chiamante, combinare quanto sopra:

<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>

Altri suggerimenti

Dai un'occhiata a xsl: param .

Modifica : non testato, ma potrebbe funzionare:

<xsl:param name="var">
  <xsl:choose>
   <xsl:when test="some_test">   
     <xsl:value-of select="string('HEY!')" />
   </xsl:when>
  </xsl:choose>
</xsl:param>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top