Use XSLT to convert delimiters to wrappers

I have an XML part that I want to convert using XSLT (using xsltproc - so only XSLT 1.0). The source XML uses some tags as delimiters, such as:

<container> <element /> <element /> <separator /> <element /> <element /> <element /> <separator /> <element /> </container> 

I need to convert this to a format that wraps these elements. So I need it to look like this:

 <container> <wrapper> <element /> <element /> </wrapper> <wrapper> <element /> <element /> <element /> </wrapper> <wrapper> <element /> </wrapper> </container> 

I just can't create a template that accomplishes this. Anyone have any thoughts?

+6
source share
1 answer

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> 
+6
source

Source: https://habr.com/ru/post/928182/


All Articles