XSL - строку в массив по разделителю - первые символы, часть, пример функции
Primary tabs
<!-- Далее функция, которая "разбивает строку в массив" - а точнене, делает
что-то похожее средствами рекурсии -->
<xsl:template name="tokenize"> <!-- -->
<xsl:param name="string"/>
<xsl:param name="separator" select="'|'"/> <!-- задаём разделитель - здесь это вертикальная черта -->
<xsl:param name="i"/> <!-- счётчик - передаётся в каждый этап рекурсии накрученным -->
<xsl:param name="limit"/> <!-- максимальное значение -передаётся неизменно не зависимо от этапа -->
<xsl:if test="$i <= $limit"> <!-- если счётчик ещё не равен максимальному значению -->
<!-- <xsl:value-of select="$i"/> --> <!-- можно вывести значение счётчик если хотите -->
<xsl:choose>
<xsl:when test="contains($string,$separator)"> <!-- если разделитель вообще содержится в строке -->
<token>
<!-- то выводим текст до первого разделителя -->
<xsl:value-of select="substring-before($string,$separator)"/>
| <!-- и например, заново печатем разделитель (можно любой знак или вообще ничего) -->
</token>
<xsl:call-template name="tokenize"> <!-- рекурсивно вызываем шаблон ("функцию") с параметрами, сказанными внутри блока -->
<xsl:with-param name="i" select="$i+1"/> <!-- накрученный счётчик - инкрементируем переменную (изменяем значение) -->
<xsl:with-param name="limit" select="$limit"/> <!-- то же самое значение ограничения (максимальное значение счётчика) -->
<xsl:with-param name="string" select="substring-after($string,$separator)"/> <!-- передаём всю подстроку после "первого" (для данной итерации) разделителя -->
</xsl:call-template>
</xsl:when>
<xsl:otherwise> <!-- если же разделителя в строке вообще нет, то -->
<token><xsl:value-of select="$string"/></token> <!-- просто печатаем эту строку -->
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
- vedro-compota's blog
- Log in to post comments
- 5862 reads
Comments
vedro-compota
Sun, 07/12/2015 - 23:35
Permalink
чтобы использовать код выше,
чтобы использовать код выше, например, в качестве элемента таблицы пишем так:
<td align="center">
<xsl:call-template name="tokenize">
<xsl:with-param name="i" select="0"/>
<xsl:with-param name="limit" select="5"/>
<xsl:with-param name="string" select="name"/> <!-- вместо name - строка, которую хотите передать -->
</xsl:call-template>
</td>
_____________
матфак вгу и остальная классика =)