Переменная повторного использования, определенная внутри выбора, вне выбора в XSLT
Вопрос
У меня есть фрагмент кода, похожий на этот:
<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>
Моя проблема в том, что я хотел бы использовать переменную $age вне выбора.Как мне это сделать?
Похожая проблема заключается в том, что у меня в XSLT-файле есть несколько шаблонов, и один из них является основным шаблоном.Вот этот:
<xsl:template match="/">
</xsl:template>
Внутри этого шаблона я вызываю несколько других шаблонов и снова хочу использовать некоторые переменные из других шаблонов.
Например, если у меня есть этот код:
<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>
Затем я хотел бы использовать $searchVar внутри моего основного шаблона.
Я думаю, что это та же самая проблема, но я не могу понять ее.
Кстати, в качестве CMS я использую Umbraco :)
Я надеюсь, что у некоторых из вас есть ответ.
Спасибо - Ким.
Решение
К №1:Переменные действительны только внутри родительского элемента.Это означает, что вы должны положить логику внутри переменная вместо «вокруг» ее:
<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>
К № 2:Используйте параметры для переноса значений в шаблоны.
<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>
Чтобы перенести значение обратно в вызывающий шаблон, объедините приведенное выше:
<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>
Другие советы
Посмотри на xsl:параметр.
Редактировать:Непроверено, но может работать:
<xsl:param name="var">
<xsl:choose>
<xsl:when test="some_test">
<xsl:value-of select="string('HEY!')" />
</xsl:when>
</xsl:choose>
</xsl:param>