[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Merging nested/adjacent n, David Carlisle | Thread | [xsl] creating frames with xsl with, Bovy, Stephen J |
[xsl] select a node: child of an an, Anthony | Date | [xsl] numbering/count(), Bruce D'Arcus |
Month |
Keywords