首页 > 解决方案 > 在 xslt 中的特定条件匹配后中断 for 循环

问题描述

https://xsltfiddle.liberty-development.net/eieFA1J/16

在这里,我试图匹配 placeholder[@md.mnem='angen'][placeholder.text='UL'] 并识别它在前面 <codes.head ID="" md.mnem="hg*"> 并存储它成变量。并在匹配后收集所有 hg* 记录,直到我找到相同或更小的 hg* 记录(在我的示例中它是 hg2,如果我找到 hg2 或 hg1,我必须打破循环)

我可以在特定匹配后选择 hg* 记录,但在匹配相同的 hg* 或更小的记录后无法中断。

谁能帮我解决这个问题,xml和xsl可以在下面的链接中找到。 https://xsltfiddle.liberty-development.net/eieFA1J/16

标签: xsltxslt-2.0

解决方案


XSLT 3xsl:iterate代替 anxsl:for-each可能有助于实现传统的循环和中断算法:

    <xsl:iterate select="$hgset">
        <xsl:choose>
            <xsl:when test="@md.mnem gt $hgValue">
                <xsl:copy-of select="."/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:break/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:iterate>

但当然,您也可以使用递归函数或模板在 XSLT 2 中实现相同的功能,或者只选择序列中“破坏”条件的第一项并使用<<运算符选择“之前”的任何内容。

另一种选择是使用<xsl:for-each-group select="$hgset" group-ending-with="*[@md.mnem le $hgValue]"><xsl:if test="position() = 1"><xsl:copy-of select="current-group()"/></xsl:if></xsl:for-each-group>.


推荐阅读