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

时间:2009-01-22 17:20:58

标签: xslt

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

6 个答案:

答案 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()&lt;=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

基本上讨论了两种技术

  1. 仅在满足特定条件时才在<xsl:for-each>的正文内执行某些操作。

  2. 指定不使用<xsl:for-each>但使用递归的处理

  3. 第二种方法具有能够立即执行退出的好处,与第一种方法相比,即使在满足退出条件后仍必须执行许多“空循环”。< / 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()=&quot;RC&quot;]"> 
        <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>