Re: [xsl] Merging common XML tree

Subject: Re: [xsl] Merging common XML tree
From: Mathieu Malaterre <mathieu.malaterre@xxxxxxxxx>
Date: Thu, 8 Jul 2010 12:49:35 +0200
On Thu, Jul 8, 2010 at 12:02 PM, Florent Georges <lists@xxxxxxxxxxxx> wrote:
> 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.

I have a limited set of filepath. For instance I cannot have
subdirectory if a file is present in a directory...

So I believe your script will work just fine for me ! Thanks a lot !
This saved me quite some time, in this yak-shaving task of utilizing
cmake to generate targetset structure for docbook olinking ...

Thanks again everyone,
--
Mathieu

Current Thread