аБСТРАКТНЫЙ вОПРОС

nail

Guest
аБСТРАКТНЫЙ вОПРОС

Как с помощью XSL превратить Число в Последовательность элементов, длина которой равна этому Числу? БЕЗ рекурсии.
Например. Есть рейтинг <rank>4</rank>.
Надо его отобразить в виде звездочек, то есть нарисовать 4 звездочки.
Такая задача в различных вариантах встречается часто.
 

vyarosh

Guest
Re: аБСТРАКТНЫЙ вОПРОС

Автор оригинала: nail
Как с помощью XSL превратить Число в Последовательность элементов, длина которой равна этому Числу? БЕЗ рекурсии.
Например. Есть рейтинг <rank>4</rank>.
Надо его отобразить в виде звездочек, то есть нарисовать 4 звездочки.
Такая задача в различных вариантах встречается часто.
Почему без рекурсии? А так просто, наверное, нет.
 

slach

Новичок
XSL - цикл for

from: RU.XML (Alexey Valikov)

Цикл что-ли? От 1 до 4?

Два основных способа - рекурсия и итерация по существующим узлам.
======CUT========
1) рекурсия

<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="n"/>
<!-- Другие переменные -->
<xsl:param name="x1"/>
<!-- ... -->
<xsl:param name="xk"/>
<xsl:choose>
<xsl:when test="$i &lt; $n">
<!-- Действия -->
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="n" select="$n"/>
<!-- Другие переменные -->
<xsl:with-param name="x1" select="функция1($i,$n,$x1,...$xk)"/>
<!-- ... -->
<xsl:with-param name="xk" select="функцияk($i,$n,$x1,...$xk)"/>
</xsl:call-template>
</xsl:when>
<xsl:eek:therwise>
<xsl:value-of select="результат($i,$n,$x1,...,$xk)"/>
</xsl:eek:therwise>
</xsl:choose>
</xsl:template>



В твоем случае будет:



<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="n"/>
<xsl:if test="$i &lt; $n">

<*>
<!-- символ звездочки- ;)>

<xsl:call-template name="for">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="n" select="$n"/>
</xsl:call-template>
</xsl:if>
</xsl:template>



Вызывать типа того:


<xsl:template match="/">
<xsl:call-template name="for">
<xsl:with-param name="n" select="101"/>
</xsl:call-template>
</xsl:template>



2) Метод Пиза для for-цикла:

Для начала выберем какое-нибудь множество узлов документа преобразования:

<xsl:variable name="set " select="document('')//node()"/>

Затем для повторения определенных действий несколько раз используем
конструкцию вида

<xsl:for-each select="$set[position() &lt;= 101]">
<!-- Действия -->
</xsl:for-each>



Только здесь проблема что у тебя минимум сто узлов должно быть в
преобразовании твоем.



Bye.

/lexi

======CUT========
 
Сверху