Я работаю с XSLT 1.0 (поэтому я не могу использовать функцию replace()), и мне нужно сделать замену в строке, прежде чем использовать эту строку для сортировки. Короче говоря, мой XML документ выглядит следующим образом:XSLT: заменить перед сортировкой
<root>
<item>
<name>ABC</name>
<rating>good</rating>
</item>
<item>
<name>BCD</name>
<rating>3</rating>
</item>
</root>
Тогда мне нужно заменить «хорошо» с «4», чтобы напечатать список целых заказанных товаров по рейтингу с использованием своего рода функцию(). Поскольку я использую XSLT 1.0, я использую этот шаблон для замены:
<xsl:template name="string-replace">
<xsl:param name="subject" select="''" />
<xsl:param name="search" select="''" />
<xsl:param name="replacement" select="''" />
<xsl:param name="global" select="false()" />
<xsl:choose>
<xsl:when test="contains($subject, $search)">
<xsl:value-of select="substring-before($subject, $search)" />
<xsl:value-of select="$replacement" />
<xsl:variable name="rest" select="substring-after($subject, $search)" />
<xsl:choose>
<xsl:when test="$global">
<xsl:call-template name="string-replace">
<xsl:with-param name="subject" select="$rest" />
<xsl:with-param name="search" select="$search" />
<xsl:with-param name="replacement" select="$replacement" />
<xsl:with-param name="global" select="$global" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$rest" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$subject" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Этот шаблон отлично работает, но проблема заключается в том, что она всегда выводит значения (то есть всегда, когда я называю шаблон что-то напечатано) , Поэтому этот шаблон не пригодится в этом случае, потому что мне нужно изменить значение «рейтинг», затем отсортировать элементы по рейтингу и, наконец, распечатать их.
Заранее благодарен!
PS: Обходной путь будет использовать два разных XSLT, но по нескольким причинам я не могу этого сделать в этом случае.
На какой платформе вы работаете? Вы можете использовать функцию расширения, выполняющую замену. –
Я не могу использовать функции расширения, я очень ограничен, мне нужно что-то в родном XSLT 1.0. – 2009-10-08 15:59:42
Думаю, что на самом деле я могу переключиться на XSLT 2.0, но проблема такая же. В XSLT 2.0 я мог бы заменить функцию replace(), но эта функция работает так же, как и мой шаблон замены, всегда печатайте что-то, а не просто меняйте значение. – 2009-10-08 16:02:08