Как прервать цикл XSLT for-each для несмежных элементов? - PullRequest
1 голос
/ 23 сентября 2011

У меня есть структурированный XML со следующей структурой:

<root>
  <item/>
  <item/>
  <something/>
  <item/>
</root>

Если я использую что-то вроде этого:

<xsl:for-each select="/root/item">

выберет все элементы item внутри списка. Я хочу прервать цикл после второго item, потому что между вторым и третьим элементом something.

Как я могу получить это?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

В 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, которые являются первымипотомки верхнего элемента.

0 голосов
/ 23 сентября 2011

Вы не можете выйти из цикла xsl: for-each .Вы должны построить свой цикл так, чтобы в первую очередь выбрать только те элементы, которые вам нужны.

В этом случае вы хотите выбрать все элементы item , которые не имеют предшествующихродной брат, который также не является элементом item .

<xsl:for-each select="/root/item[not(preceding-sibling::*[not(self::item)])]"> 
   <xsl:value-of select="position()" />
</xsl:for-each>

При использовании он должен выбирать только первые два элемента item .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...