Re: [xsl] Merging nested/adjacent nodes

Subject: Re: [xsl] Merging nested/adjacent nodes
From: chris <oneskiingfool@xxxxxxxxx>
Date: Thu, 19 May 2005 18:22:52 -0600
Most excellent..  Thank you both for your help.  I tried a hundred
different variations of something similar but you somehow hit the nail
on the head.... even though I left an important piece out.  What I
failed to mention is that, in that example, I wanted to *only* merge
the <supervisor> nodes.  So your output is exactly what I was looking
for, but I didnt' include an important component in my examples
(multiple <employee> nodes with the same name, not to be merged).
Fortunately, your code did the bulk of the work and it only took me a
minute to modify it to the following (I may find some holes in it
later, but it seems to be working for now)...

<xsl:template name="m" match="*|/">
<xsl:param name="c" select="*"/>
<xsl:for-each-group select="$c" group-adjacent="self::supervisor/@name
| self::employee">
<xsl:choose>
<xsl:when test="current-group[1]/self::superviser">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:call-template name="m">
<xsl:with-param name="c" select="current-group()/*"/>
</xsl:call-template>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:template>

On 5/19/05, David Carlisle <davidc@xxxxxxxxx> wrote:
>
> Turns out that this is simpler than it looks, simpler than I thought it
> was going to be anyway. Powerful voodoo this for-each-group stuff....
>
>
> emp.xsl:
>
> <xsl:stylesheet
>   version="2.0"
>   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> >
>
> <xsl:output indent="yes"/>
> <xsl:strip-space elements="*"/>
>
>
> <xsl:template name="m" match="*|/">
> <xsl:param name="c" select="*"/>
> <xsl:for-each-group select="$c" group-adjacent="string(@name)">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:call-template name="m">
>  <xsl:with-param name="c" select="current-group()/*"/>
> </xsl:call-template>
> </xsl:copy>
> </xsl:for-each-group>
> </xsl:template>
>
> </xsl:stylesheet>
>
>
> emp.xml
>
> <employees>
>        <supervisor name="jimmy">
>                <supervisor name="bob">
>                        <employee name="grunt_1"/>
>                </supervisor>
>        </supervisor>
>        <supervisor name="jimmy">
>                <supervisor name="bob">
>                        <employee name="grunt_2"/>
>                </supervisor>
>        </supervisor>
>        <supervisor name="jimmy">
>                <employee name="grunt_3"/>
>        </supervisor>
>        <employee name="grunt_4"/>
>        <supervisor name="jimmy">
>                <supervisor name="bob">
>                        <employee name="grunt_5"/>
>                </supervisor>
>        </supervisor>
> </employees>
>
>
>
> $ saxon8 emp.xml emp.xsl
> <?xml version="1.0" encoding="UTF-8"?>
> <employees>
>   <supervisor name="jimmy">
>      <supervisor name="bob">
>         <employee name="grunt_1"/>
>         <employee name="grunt_2"/>
>      </supervisor>
>      <employee name="grunt_3"/>
>   </supervisor>
>   <employee name="grunt_4"/>
>   <supervisor name="jimmy">
>      <supervisor name="bob">
>         <employee name="grunt_5"/>
>      </supervisor>
>   </supervisor>
> </employees>
>
>
> ________________________________________________________________________
> This e-mail has been scanned for all viruses by Star. The
> service is powered by MessageLabs. For more information on a proactive
> anti-virus service working around the clock, around the globe, visit:
> http://www.star.net.uk
> ________________________________________________________________________

Current Thread