输入:
<a>
<b/>
<b/>
<c>c1</c>
<d>d1</d>
<b/>
<e>e2</e>
<c>c2</c>
<b/>
<f>f3</f>
<b/>
</a>
需求:两个b之间的元素被包含在上一个b元素中。
实现脚本:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/a">
<a>
<xsl:for-each select="b">
<b>
<xsl:variable name="thisB" select="generate-id(current())"/>
<xsl:for-each select="following-sibling::*[name()!='b' and generate-id(preceding-sibling::b
[1]) = $thisB]">
<xsl:variable name="nextB" select="generate-id(preceding-sibling::b[1])"/>
<xsl:element name="{name()}">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:for-each>
</b>
</xsl:for-each>
</a>
</xsl:template>
</xsl:stylesheet>
输出:
<a>
<b/>
<b>
<c>c1</c>
<d>d1</d>
</b>
<b>
<e>e2</e>
<c>c2</c>
</b>
<b>
<f>f3</f>
</b>
<b/>
</a>
要点:xsl:variable可以保存节点集;Xpath中的axis非常有用。