Réutiliser la variable définie dans le choix, en dehors du choix dans XSLT
Question
J'ai un morceau de code qui ressemble à ceci:
<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>
Mon problème est que je voudrais utiliser la variable $ age en dehors du choix. Comment je fais ça?
Un problème similaire est que j'ai plusieurs modèles dans mon fichier XSLT, dont l'un est le modèle principal. Celui-ci:
<xsl:template match="/">
</xsl:template>
À l'intérieur de ce modèle, j'appelle plusieurs autres modèles et j'aimerais à nouveau utiliser certaines des variables des autres modèles.
Dans l'exemple, si j'ai ce code:
<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>
Ensuite, j'aimerais utiliser le $ searchVar à l'intérieur de mon modèle principal.
Je pense que c'est un peu le même problème, mais je n'arrive pas à comprendre celui-ci.
Et je lance Umbraco comme mon CMS, soit dit en passant:
J'espère que certains d'entre vous ont la réponse.
Merci - Kim
La solution
Au n ° 1: les variables ne sont valides que dans leur élément parent. Ce qui signifie que vous devez mettre la logique à l'intérieur de la variable au lieu de "autour". ça:
<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>
Au n ° 2: utilisez des paramètres pour transférer des valeurs dans des modèles.
<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>
Pour transférer une valeur dans le modèle appelant, combinez ce qui précède:
<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>
Autres conseils
Consultez xsl: param .
Modifier : non testé, mais peut fonctionner:
<xsl:param name="var">
<xsl:choose>
<xsl:when test="some_test">
<xsl:value-of select="string('HEY!')" />
</xsl:when>
</xsl:choose>
</xsl:param>