Как смоделировать xsl: для каждого - PullRequest
1 голос
/ 04 октября 2011

Есть идеи, как симулировать

<xsl:for-each select="1 to 3">

в XSLT 1.0?

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 октября 2011

Использование рекурсии:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

    <xsl:template match="/">
        <xsl:call-template name="foreach">
            <xsl:with-param name="i" select="0"/>
            <xsl:with-param name="n" select="10"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="foreach">
        <xsl:param name="i"/>
        <xsl:param name="n"/>

        <xsl:if test="$i &lt; $n">
            <xsl:value-of select="$i"/>

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

    </xsl:template>

</xsl:stylesheet>
2 голосов
/ 04 октября 2011

@ Кирилл предоставил «стандартный ответ».

Хотя это правильно, у него есть одна практическая проблема - для больших значений N, по крайней мере, для некоторых XSLTпроцессоры, это преобразование мучительно падает - из-за переполнения стека.

Существует способ выполнить такие преобразования для очень большого N обычно, без переполнения стека - на всех процессорах XSLT .

Узнайте больше о рекурсии DVC (Разделяй и властвуй) в этот ответ .

1 голос
/ 04 октября 2011

Для небольших чисел в вашей таблице стилей или во входном документе, вероятно, достаточно узлов для простой обработки, например. три узла

<xsl:for-each select="//node()[position() &lt; 4]">
  <!-- now output stuff here -->
</xsl:for-each>
...