This conversion is :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:key name="kFollowing" match="element" use="generate-id(preceding-sibling::separator[1])"/> <xsl:template match="/*"> <container> <xsl:apply-templates select= "element [generate-id() = generate-id(key('kFollowing', generate-id(preceding-sibling::separator[1]) )[1] ) ]"/> </container> </xsl:template> <xsl:template match="element"> <wrapper> <xsl:copy-of select= "key('kFollowing', generate-id(preceding-sibling::separator[1]) )"/> </wrapper> </xsl:template> </xsl:stylesheet>
when applied to the provided XML document:
<container> <element /> <element /> <separator /> <element /> <element /> <element /> <separator /> <element /> </container>
creates the desired, correct result :
<container> <wrapper> <element/> <element/> </wrapper> <wrapper> <element/> <element/> <element/> </wrapper> <wrapper> <element/> </wrapper> </container>
source share