如何在XSLT for-each中使用continue?

7

如何在xslt的for-each循环中使用continue(不是退出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个回答

2
在这种情况下,你可能希望根据条件执行两个代码。实际上,你只有在$test1A为真时才希望从第一个if继续执行。
在这种情况下,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语句为假时,你将执行第二个if语句。


1

你需要使用xml:choose和xml:when。xsl:choose元素从多个可能的选择中选择一个。因此,当表达式求值为true时,它执行该块,然后进入下一个循环。


如果OP的样例输入正确反映了他的问题,那么xsl:choose将无法帮助他。请参考我的答案。 - Emiliano Poggi

0

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

我建议将整个循环体分解成较小的块,以最小化复合if的数量。

编辑:

当您使用完整的复合if时,它看起来像这样:

<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时,您需要在所有后续代码中添加一个保护语句。
如果if语句中有大量的代码,那么将它们拆分成自己的模板并调用它们会使代码更易读。

我不认为这是必要的。请看我的回答。 - Emiliano Poggi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接