nick public nickpubl(_at_)gmail(_dot_)com wrote:
I need to convert a flat structure like this
<root>
<H>1</H>
<I>1-1</I>
<I>1-2</I>
<I>1-3</I>
<H>2</H>
<I>2-1</I>
<I>2-2</I>
</root>
in one like this
<root>
<H>
1
<I>1-1</I>
<I>1-2</I>
<I>1-3</I>
</H>
<H>
2
<I>2-1</I>
<I>2-2</I>
</H>
</root>
Can't you use XSLT 2.0 with
<xsl:template match="root">
<xsl:copy>
<xsl:for-each-group select="*" group-starting-with="H">
<xsl:copy>
<xsl:apply-templates select="node(), current-group() except ."/>
? That way it is easy to process your input.
With XSLT 1.0 you might want to define a key
<xsl:key name="group" match="I" use="generate-id(preceding-sibling::H[1])"/>
and then you can use
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="H"/>
</xsl:copy>
</xsl:template>
<xsl:template match="H">
<xsl:copy>
<xsl:apply-templates select="node() | key('group', generate-id())"/>
</xsl:copy>
</xsl:template>
Both approaches need the identity transformation template to copy the
remaining nodes like the I elements.
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--