xsl-list
[Top] [All Lists]

RE: restructuring element hierarchy using xslt

2003-09-29 10:20:42
Why do I bother giving you a design when someone else gives you the code
and tests it?

Sigh.

Michael Kay

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Dimitre Novatchev
Sent: 29 September 2003 15:23
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] restructuring element hierarchy using xslt 


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


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



<Prev in Thread] Current Thread [Next in Thread>