如何在XSLT中打破for-each循环?
答案 0 :(得分:28)
XSLT是以非常实用的方式编写的,并且在这种风格中没有等效的break
语句。你能做的就是这样:
<xsl:for-each select="...nodes...">
<xsl:if test="...some condition...">
...body of loop...
</xsl:if>
</xsl:for-each>
这样for-each
仍会迭代遍历所有节点,但只有条件为真时才会执行循环体。
答案 1 :(得分:17)
在select
元素的for-each
属性中设置停止“循环”的条件。例如,要在四个要素之后“打破”:
<xsl:for-each select="nodes[position()<=4]">
迭代但不包括满足某些特定条件的节点:
<xsl:for-each select="preceding-sibling::node[condition]">
答案 2 :(得分:8)
XSLT不是一种程序性语言;不要把for-each视为你在Java中循环的方式的“循环”。 For-each是一种将模板应用于一堆项目的方法。它不一定按特定的顺序发生,因此您不能将其视为“将这个模板应用于一堆项目中,直到发生这种情况,然后停止”。
也就是说,您可以使用select属性来过滤结果,因此它更像是“将模板应用于一堆项目中的每一项,但只有在这样的情况下才适用”。
如果您真正想要的是“将模板应用于一堆项目中的每一项,其中对于它们是正确的,但仅对于第一项是正确的”,您可以组合select属性使用position()函数。
答案 3 :(得分:4)
无法使用句法构造指定<xsl:for-each>
XSLT指令正文的“中断”,但 可以模拟 < /强>
topxml.com上的这段代码片段详细介绍了该技术:
In case you need a ""break"" from an xsl:for-each loop
基本上讨论了两种技术:
仅在满足特定条件时才在<xsl:for-each>
的正文内执行某些操作。
指定不使用<xsl:for-each>
但使用递归的处理
第二种方法具有能够立即执行退出的好处,与第一种方法相比,即使在满足退出条件后仍必须执行许多“空循环”。< / p>
答案 4 :(得分:0)
您好,我知道这是一个老帖子,但也许它可以帮助其他开发人员。我已经找到了一种在XSLT中为每个打破一个方法的方法,它不是一个休息,但如果你看到代码,你就会得到它。如您所知或不知道您可以在xslt中使用内联C#代码。在这个例子中,我想循环节点并使用值RC获取第一个NTE节点但是如果我得到一个与NTE节点不同的节点,我想停止查看条件。所以我在C#代码中设置了一个全局变量,每次通过一个节点时我都会询问该值:
<xsl:value-of select="userCSharp:SetStopForeach('true')" />
<xsl:for-each select="following-sibling::node()">
<xsl:if test="local-name()='NTE_NotesAndComments_3' and userCSharp:GetStopForeach()" >
<xsl:for-each select="NTE_4_CommentType">
<xsl:if test="(CE_0364_0_IdentifierSt)[text()="RC"]">
<ns0:RESULTAAT_COMMENTAAR>
<xsl:for-each select="../NTE_3_Comment">
<xsl:value-of select="./text()" />
</xsl:for-each>
</ns0:RESULTAAT_COMMENTAAR>
</xsl:if>
</xsl:for-each>
</xsl:if>
<xsl:if test="local-name()='ORC_CommonOrder'" >
<xsl:value-of select="userCSharp:SetStopForeach('false')" />
</xsl:if>
</xsl:for-each>
.....
<msxsl:script language="C#" implements-prefix="userCSharp">
<![CDATA[
public bool StopForeach=false;
public bool GetStopForeach() {
return StopForeach;
}
public string SetStopForeach(bool aValue) {
StopForeach=aValue;
return "";
}
]]>
</msxsl:script>
答案 5 :(得分:0)
我有类似的情况,这是我写的代码。出于逻辑原因,我无法适应条件01的其他条件。
<xsl:for-each select="msxsl:node-set($DATA6)[condition01]">
<xsl:choose>
<xsl:when test="not((condtion02 or condition03) and condition04)">
--body of for loop
</xsl:when>
</xsl:choose>
</xsl:for-each>