如何在xslt for-each中继续

时间:2011-07-12 04:09:43

标签: xml xslt

如何在xslt for-each中执行继续(不退出for-each,而是继续 for-each

像:

<xsl:for-each select="asd">

    <xsl:if test="$test1">
        <!--some stuff-->
        <xsl:if test="$test1A">
            <!--CONTINUE()-->
        </xsl:if>
    </xsl:if>

    <xsl:if test="$test2">
        <!--some stuff-->
        <!--CONTINUE()-->
    </xsl:if>

    <!--main stuff-->
</xsl:for-each>

3 个答案:

答案 0 :(得分:2)

在这种特定情况下,您似乎希望根据条件执行两个代码。事实上,只有当if成立时,您才希望从第一个$test1A继续。

在这种情况下,xsl:choose对您没有帮助。您必须使用纯逻辑并模拟所需行为:

<xsl:for-each select="asd">
    <xsl:if test="$test1">
        <!--some stuff-->
        <xsl:if test="$test1A">
            <!--CONTINUE()-->
        </xsl:if>
    </xsl:if>
    <xsl:if test="$test2 and not($test1A)">
        <!--some stuff-->
        <!--CONTINUE()-->
    </xsl:if>
    <!--main stuff-->
</xsl:for-each>

使用上述条件,只有当第一个分支中的嵌套if为false时,才会执行第二个if

答案 1 :(得分:1)

认为你需要xml:choose和xml:when。 xsl:choose元素会在众多可能的替代选项中选择一个。因此,当expression被评估为true时,它会执行该块,然后进入下一个循环。

答案 2 :(得分:0)

在XSL中没有类似于continue的构造。您必须重新构建代码流以实现相同的效果。

我建议将整个循环体分解成更小的块,以便最小化化合物的数量。

编辑:

以下是使用完整复合ifs时的样子:

<xsl:for-each select="asd">
    <xsl:if test="$test1">
        <!--some stuff (1)-->
    </xsl:if>
    <xsl:if test="not($test1 and $test1A)">
        <xsl:choose>
            <xsl:when test="$test2">
                <!--some stuff (2)-->            
            </xsl:when>
            <xsl:otherwise>
                <!--main stuff (3)-->    
            </xsl:otherwise>
        </xsl:choose>
    </xsl:if>
</xsl:for-each>

每当您需要continue时,您需要将所有以下代码包装在一个警卫中。

代码更难以作为单个语句阅读,如果代码中有大量代码,那么你最好将它们分解成自己的模板并调用它们。