Ian Roberts が説明したように、XSLT にはループを分割するという概念はありません。処理するノードを事前に決定する必要があります。「2)」が含まれる最初のabc要素までの要素にのみ関心があるように思えます。
ここではxsl:apply-templatesを使用する方が実際には良いかもしれません。
<xsl:apply-templates select="abc[not(preceding-sibling::abc[contains(xyz, '2)')])]" />
したがって、これは先行する '2)' 要素を持たないすべての要素を選択します。
次に、 xyz要素の内容に応じて、 abc要素に一致するテンプレートを追加できます。たとえば、「2)」がある場合に「XSL_1.0 Programming」を出力するには、次のようにします。
<xsl:template match="abc[contains(xyz, '2)')]">
<xsl:text>XSL_1.0 Programming</xsl:text>
</xsl:template>
ここに完全な XSLT があります
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:apply-templates select="abc[not(preceding-sibling::abc[contains(xyz, '2)')])]" />
</xsl:template>
<xsl:template match="abc">
<xsl:value-of select="concat(xyz, ' ')" />
</xsl:template>
<xsl:template match="abc[contains(xyz, '2)')]">
<xsl:text>XSL_1.0 Programming </xsl:text>
</xsl:template>
</xsl:stylesheet>
次の XML に適用した場合 (ルート要素があることに注意してください)
<root>
<abc>
<def>some text1</def>
<xyz>stack overflow</xyz>
</abc>
<abc>
<def>some text2</def>
<xyz>stack overflow 2)</xyz>
</abc>
<abc>
<def>some text3</def>
<xyz>stack overflow</xyz>
</abc>
<abc>
<def>some text</def>
<xyz>stack overflow 3)</xyz>
</abc>
</root>
以下が出力されます
stack overflow
XSL_1.0 Programming