如何让下一个节点在XSLT for each loop中迭代?

问题描述:

如果我有每个循环如:如何让下一个节点在XSLT for each loop中迭代?

<xsl:for-each select="$pChildren"> 
    <xsl:variable name="vNext" select="???" /> 
</xsl:for-each> 

我想下一个节点分配给在for-each循环迭代到vNext,如果有的话。

我试过$pChildren[position()+1],但没有奏效。

+0

这取决于你如何定义'$ pChildren'。在大多数情况下,它将是'follow-sibling :: * [1]',但并不完全确定。 –

+0

为什么'$ pChildren [position()+ 1]'不起作用?它看起来是正确的,比'follow-sibling :: * [1]'更普遍。你可以添加一些上下文吗? – nwellnhof

+1

@nwellnhof它不起作用,因为'[position()+ 1]'是[[position()= position()+ 1]'的简称,永远不会是真的。 –

我更愿意回答这个问题,同时看到整个背景,但我相信:

<xsl:for-each select="$pChildren"> 
    <xsl:variable name="i" select="position()" /> 
    <xsl:variable name="vNext" select="$pChildren[$i + 1]" /> 
</xsl:for-each> 

应该为你工作。

如果您想引用序列中的下一个项目,您可能不应该首先使用xsl:for-each语句。颠倒节点的顺序并使用xsl:iterate(除非您主要使用多线程)。

更自然的方式来做到这一点是:

<xsl:iterate select="reverse($pchildren)"> 
<xsl:param name="last" select="()"/> 

Do Stuff Here using $last to reference the item that comes next in $pchildren. 
<xsl:next-iteration> 
<xsl:with-param name="last" select="."/> 
</xsl:next-iteration> 
</xsl:iterate/>