Riutilizza la variabile definita all'interno di Scegli, al di fuori di Scegli in XSLT
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
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>