Subject: Re: [xsl] Merging common XML tree From: Florent Georges <lists@xxxxxxxxxxxx> Date: Thu, 8 Jul 2010 03:02:02 -0700 (PDT) |
Mathieu Malaterre wrote: Hi, > <dirs> > <dir name="A"> > <dir name="B"> > <file name="C"> > </dir> > </dir> > <dir name="A"> > <dir name="B"> > <file name="D"> > </dir> > </dir> > </dirs> > and my target output tree should looks like: > <dirs> > <dir name="A"> > <dir name="B"> > <file name="C"> > <file name="D"> > </dir> > </dir> > </dirs> I would use recursive grouping: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="..." exclude-result-prefixes="#all" version="2.0"> <xsl:output indent="yes"/> <xsl:template match="dirs"> <xsl:copy> <xsl:call-template name="my:handle-dirs"> <xsl:with-param name="dirs" select="*"/> </xsl:call-template> </xsl:copy> </xsl:template> <xsl:template name="my:handle-dirs"> <xsl:param name="dirs" as="element(dir)+"/> <xsl:for-each-group select="$dirs" group-by="@name"> <dir name="{ current-grouping-key() }"> <xsl:copy-of select="current-group()/file"/> <xsl:if test="current-group()/dir"> <xsl:call-template name="my:handle-dirs"> <xsl:with-param name="dirs" select=" current-group()/dir"/> </xsl:call-template> </xsl:if> </dir> </xsl:for-each-group> </xsl:template> </xsl:stylesheet> You may have to adapt the content of the for-each-group for the precise ordering you want between files and dirs when a dir contains both. Regards, -- Florent Georges http://fgeorges.org/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: AW: [xsl] Merging common XML tr, Michael Kay | Thread | Re: [xsl] Merging common XML tree, Mathieu Malaterre |
AW: [xsl] Merging common XML tree, Szabo, Patrick \(LNG | Date | Re: AW: [xsl] Merging common XML tr, Michael Kay |
Month |