Re: [xsl] restructuring element hierarchy using xslt

Subject: Re: [xsl] restructuring element hierarchy using xslt
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Mon, 29 Sep 2003 07:23:19 -0700 (PDT)
This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 
 <xsl:variable name="Digits" select="1234567890"/>
 
 <xsl:template match="/*">
  <t>
   <xsl:apply-templates 
    select="het[not(contains(@position, '.'))]"/>
   </t>
 </xsl:template>
  
  <xsl:template match="het">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates 
       select="../het[starts-with(@position, current()/@position)
                     and
                      string-length(translate(@position, 
                                              $Digits, 
                                              ''
                                              )
                                   )
                      =
                       1 + string-length(translate(current()/@position, 
                                                   $Digits, 
                                                  ''
                                                  )
                                         )
                     ]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


When applied to your source.xml:

<t>
  <het position="1"></het>
  <het position="1.1"></het>
  <het position="1.1.1"></het>
  <het position="1.1.2"></het>
  <het position="1.2"></het>
  <het position="1.2.1"></het>
  <het position="2"></het>
  <het position="2.1"></het>
  <het position="2.1.1"></het>
</t>

produces the wanted result:


<t>
   <het position="1">
      <het position="1.1">
         <het position="1.1.1"/>
         <het position="1.1.2"/>
      </het>
      <het position="1.2">
         <het position="1.2.1"/>
      </het>
   </het>
   <het position="2">
      <het position="2.1">
         <het position="2.1.1"/>
      </het>
   </het>
</t>


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL



> I have an xml document like this:
> 
> <het position="1"></het>
> <het position="1.1"></het>
> <het position="1.1.1"></het>
> <het position="1.1.2"></het>
> <het position="1.2"></het>
> <het position="1.2.1"></het>
> <het position="2"></het>
> <het position="2.1"></het>
> <het position="2.1.1"></het>
> 
> and i was trying to get it to look like this:
> 
> <het position="1">
>  <het position="1.1">
>   <het position="1.1.1">
>   </het>
>   <het position="1.1.2">
>   </het>
>  </het>
>  <het position="1.2">
>   <het position="1.2.1">
>   </het>
>  </het>
> </het>
> <het position="2">
>  <het position="2.1">
>   <het position="2.1.1">
>   </het>
>  </het>
> </het>
> 
> In other words make it nested. I can get the first set of  elements out 
> by doing a contains() function in a predicate (<xsl:template 
> match="het[contains(@position, '.')=false]">) but i am having a problem 
> with template matching, i know i can't put a template match within a 
> template match and this is causing me a bit of trouble.



__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread