Reutilizar la variable definida dentro de elegir, fuera de elegir en XSLT
Pregunta
Tengo un fragmento de código que se parece a esto:
<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>
Mi problema es que me gustaría usar la variable $ age fuera de la opción. ¿Cómo hago eso?
Un problema similar es que tengo varias plantillas en mi archivo XSLT, y una de ellas es la plantilla principal. Este:
<xsl:template match="/">
</xsl:template>
Dentro de esta plantilla, llamo a varias otras plantillas, y nuevamente me gustaría usar algunas de las variables de las otras plantillas.
En el ejemplo, si tengo este código:
<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>
Luego me gustaría usar $ searchVar dentro de mi plantilla principal.
Creo que es el mismo problema, pero parece que no puedo resolverlo.
Por cierto, yo uso Umbraco como mi CMS :)
Espero que algunos de ustedes tengan la respuesta.
Gracias - Kim
Solución
A # 1: las variables son válidas solo dentro de su elemento principal. Lo que significa que debe colocar la lógica dentro de la variable en lugar de " alrededor de " it:
<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>
A # 2: Usa parámetros para transportar valores en plantillas.
<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>
Para volver a transportar un valor a la plantilla de llamada, combine lo anterior:
<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>
Otros consejos
Echa un vistazo a xsl: param .
Editar : no probado, pero puede funcionar:
<xsl:param name="var">
<xsl:choose>
<xsl:when test="some_test">
<xsl:value-of select="string('HEY!')" />
</xsl:when>
</xsl:choose>
</xsl:param>