2011-09-23 49 views
1

我有一个结构化的XML这种结构:如何中断不连续元素的每个循环的XSLT?

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

如果我用的是这样的:

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

它会拾取所有列表里面的item元素。我想在第二个item之后中断循环,因为在第二个和第三个之间有一个something元素。

我怎样才能得到这个?

+0

你不看这个http://stackoverflow.com/questions/470045/how-to-break-a-for-each-loop-in-xslt? – Mansuro

回答

0

你实际上不可能分出一个xsl:for-each循环。你需要构建你的循环,以便首先选择你想要的元素。

在这种情况下,要选择那些没有前面的兄弟,是不是也是一个项目元素的所有项目元素。

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

当这样使用时,它应该只选择前两个元件。

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元素是的起始组顶级元素的第一个孩子。

相关问题