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仍将遍历所有节点,但只有条件为真时才会执行循环体.
小智 17
select在for-each元素的属性中放置停止"循环"的条件.例如,要在四个要素之后"打破":
<xsl:for-each select="nodes[position()<=4]">
Run Code Online (Sandbox Code Playgroud)
迭代但不包括满足某些特定条件的节点:
<xsl:for-each select="preceding-sibling::node[condition]">
Run Code Online (Sandbox Code Playgroud)
XSLT不是一种过程语言; 不要把for-each视为你在Java中循环的方式的"循环".For-each是一种将模板应用于一堆项目的方法.它不一定按特定的顺序发生,因此您不能将其视为"将此模板应用于一堆项目中,直到发生这种情况,然后停止".
也就是说,您可以使用select属性来过滤结果,因此它更像是"将模板应用于一堆项目中的每一个,但只有在这样的情况下才适用".
如果您真正想要的是"将模板应用于一堆项目中,对于它们来说是真实的,但只有第一个才是这样",您可以将select属性与位置结合使用()函数.
XSLT 指令主体的“中断”<xsl:for-each>不能使用语法结构指定,但可以模拟。
本质上讨论了两种技术:
<xsl:for-each> 仅当满足特定条件时才在体内执行某些操作。select如果可以在属性中指定条件,则可以改进这一点<xsl:for-each>——在这种情况下,仅处理必要的节点。例如,请参见:/sf/answers/527282171/
指定不使用递归而是使用递归的处理<xsl:for-each>。有许多使用 XSLT 进行递归处理的示例。代码见: https: //fxsl.sf.net/
第二种方法的优点是能够立即执行退出,而第一种方法即使在满足退出条件后仍必须执行许多“空循环”。