如何模拟xsl:for-each

时间:2011-10-04 10:49:37

标签: xslt xslt-2.0 xslt-1.0

任何想法如何模拟

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

在XSLT 1.0中?

由于

3 个答案:

答案 0 :(得分:3)

使用递归:

<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>

答案 1 :(得分:2)

@Kirill提供了“标准答案”。

虽然它是正确的,但它有一个实际问题 - 对于大N的值,至少在某些XSLT处理器上,由于堆栈溢出,这种转换很痛苦地崩溃。

有一种方法可以正常执行非常大的N转换,没有堆栈溢出 - 所有XSLT处理器上的

this answer 中详细了解DVC(分而治之)递归。

答案 2 :(得分:1)

对于较小的数字,您的样式表或输入文档可能只有足够的节点来处理,例如三个节点

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