我有一个具有这种结构的结构化XML:
<root>
<item/>
<item/>
<something/>
<item/>
</root>
如果我使用这样的东西:
<xsl:for-each select="/root/item">
它将选择列表中的所有item
元素。我想在第二个item
之后中断循环,因为在第二个和第三个之间有一个something
元素。
我怎么能得到这个?
答案 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
元素的起始组顶级元素。