В XSLT нет никакой возможности для "прорыва" из <xsl:for-each>
или из <xsl:apply-templates>
, кроме использования <xsl:message terminate="yes"/>
, которое вы, вероятно, не хотите.Это связано с тем, что XSLT является функциональным языком и, как и в любом функциональном языке, отсутствует понятие «порядок выполнения» - например, код может выполнять параллельно на всехвыбранные узлы.
Решение состоит в том, чтобы указать в атрибуте select
выражение, выбирающее точно требуемые узлы.
Использование :
<xsl:for-each select="/*/*[not(self::item)][1]/preceding-sibling::*">
<!-- Processing here -->
</xsl:for-each>
Выбирает для обработки всех предшествующих элементов родные элементы первого дочернего элемента верхнего элемента, который не является item
- это означает начальную группу смежных элементов item
, которые являются первымипотомки верхнего элемента.