如何在XSLT中打破for-each循环?

Dan*_*ira 19 xslt

如何在XSLT中打破for-each循环?

Gre*_*ill 28

XSLT是以非常实用的方式编写的,并且在这种风格中没有相应的break语句.你能做的是这样的:

<xsl:for-each select="...nodes...">
    <xsl:if test="...some condition...">
        ...body of loop...
    </xsl:if>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

这样,for-each仍将遍历所有节点,但只有条件为真时才会执行循环体.

  • 在“非常函数式风格”中,也没有 for-each 循环(尽管有迭代构造),也没有 if 语句(尽管有使用防护和条件定义的逻辑)。 (2认同)

小智 17

selectfor-each元素的属性中放置停止"循环"的条件.例如,要在四个要素之后"打破":

<xsl:for-each select="nodes[position()&lt;=4]">
Run Code Online (Sandbox Code Playgroud)

迭代但不包括满足某些特定条件的节点:

<xsl:for-each select="preceding-sibling::node[condition]">
Run Code Online (Sandbox Code Playgroud)


Jac*_*son 8

XSLT不是一种过程语言; 不要把for-each视为你在Java中循环的方式的"循环".For-each是一种将模板应用于一堆项目的方法.它不一定按特定的顺序发生,因此您不能将其视为"将此模板应用于一堆项目中,直到发生这种情况,然后停止".

也就是说,您可以使用select属性来过滤结果,因此它更像是"将模板应用于一堆项目中的每一个,但只有在这样的情况下才适用".

如果您真正想要的是"将模板应用于一堆项目中,对于它们来说是真实的,但只有第一个才是这样",您可以将select属性与位置结合使用()函数.

  • &lt;xsl:for-each/&gt; 用于将模板应用于所选节点是不正确的。通常 &lt;xsl:for-each&gt; 包含在每个选定节点上作为当前节点执行的内联代码。 (2认同)

Dim*_*hev 6

XSLT 指令主体的“中断”<xsl:for-each>不能使用语法结构指定,但可以模拟

本质上讨论了两种技术

  1. <xsl:for-each> 仅当满足特定条件时才在体内执行某些操作。select如果可以在属性中指定条件,则可以改进这一点<xsl:for-each>——在这种情况下,仅处理必要的节点。例如,请参见:/sf/answers/527282171/

  2. 指定不使用递归而是使用递归的处理<xsl:for-each>。有许多使用 XSLT 进行递归处理的示例。代码见: https: //fxsl.sf.net/

第二种方法的优点是能够立即执行退出,而第一种方法即使在满足退出条件后仍必须执行许多“空循环”。