如何为不连续的元素中断每个循环的XSLT?

时间:2011-09-23 15:34:01

标签: xslt foreach

我有一个具有这种结构的结构化XML:

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

如果我使用这样的东西:

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

它将选择列表中的所有item元素。我想在第二个item之后中断循环,因为在第二个和第三个之间有一个something元素。

我怎么能得到这个?

2 个答案:

答案 0 :(得分:0)

您实际上无法突破 xsl:for-each 循环。你需要构造你的循环,以便首先只选择你想要的元素。

在这种情况下,您要选择所有元素,这些元素没有前面的兄弟,也不是 item 元素。

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

使用此功能时,只应选择前两个元素。

答案 1 :(得分:0)

在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元素的起始组顶级元素。