Reutilizar variável definida dentro de escolha, fora de escolha em XSLT
Pergunta
Eu tenho um trecho de código semelhante a este:
<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>
Meu problema é que gostaria de usar a variável $age fora da escolha.Como faço isso?
Um problema semelhante é que tenho vários modelos em meu arquivo XSLT e um deles é o modelo principal.Este:
<xsl:template match="/">
</xsl:template>
Dentro deste modelo, chamo vários outros modelos e, novamente, gostaria de usar algumas das variáveis dos outros modelos.
Por exemplo, se eu tiver 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>
Então eu gostaria de usar $searchVar dentro do meu modelo principal.
É o mesmo problema, eu acho, mas não consigo entender isso.
E, a propósito, eu executo o Umbraco como meu CMS :)
Espero que alguns de vocês tenham a resposta.
Obrigado - Kim
Solução
Para #1:As variáveis são válidas apenas em seu elemento pai.O que significa que você deve colocar a lógica dentro a variável em vez de "em torno" dela:
<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>
Para #2:Use parâmetros para transportar valores para modelos.
<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 transportar um valor de volta ao modelo de chamada, combine o acima:
<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>
Outras dicas
Dê uma olhada em xsl:param.
Editar:Não testado, mas pode funcionar:
<xsl:param name="var">
<xsl:choose>
<xsl:when test="some_test">
<xsl:value-of select="string('HEY!')" />
</xsl:when>
</xsl:choose>
</xsl:param>