[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] restructuring element hierarchy using xslt


Subject: RE: [xsl] restructuring element hierarchy using xslt
From: Americo Albuquerque <melinor@xxxxxxxx>
Date: Mon, 29 Sep 2003 17:46:57 +0100

Hi

This is agrouping problem, you are grouping by @position, each '.'
adding a new group level.

You can use the Meunchian grouping to obtain your desired output

Each key defines a new group level, if you want a new level you'll have
to add a new key and a new template with mode="level[next level]"

Stylesheet:

 <xsl:key match="het" name="hets"
use="substring-before(concat(@position,'.'),'.')"/>
 <xsl:key match="het" name="hets"
use="concat(substring-before(concat(@position,'.'),'.'),'-',substring-be
fore(concat(substring-after(@position,'.'),'.'),'.'))"/>
 <xsl:key match="het" name="hets"
use="concat(substring-before(concat(@position,'.'),'.'),'-',substring-be
fore(concat(substring-after(@position,'.'),'.'),'.'),'-',substring-befor
e(concat(substring-after(substring-after(@position,'.'),'.'),'.'),'.'))"
/>
 <xsl:template match="doc">
  <xsl:apply-templates mode="level1"
select="het[generate-id()=generate-id(key('hets',substring-before(concat
(@position,'.'),'.')))][not(generate-id()=generate-id(current()))]"/>
 </xsl:template>
 <xsl:template match="het" mode="level1">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates mode="level2"
select="key('hets',substring-before(concat(@position,'.'),'.'))[generate
-id()=generate-id(key('hets',concat(substring-before(concat(@position,'.
'),'.'),'-',substring-before(concat(substring-after(@position,'.'),'.'),
'.'))))][not(generate-id()=generate-id(current()))]"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match="het" mode="level2">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates mode="level3"
select="key('hets',concat(substring-before(concat(@position,'.'),'.'),'-
',substring-before(concat(substring-after(@position,'.'),'.'),'.')))[gen
erate-id()=generate-id(key('hets',concat(substring-before(concat(@positi
on,'.'),'.'),'-',substring-before(concat(substring-after(@position,'.'),
'.'),'.'),'-',substring-before(concat(substring-after(substring-after(@p
osition,'.'),'.'),'.'),'.'))))][not(generate-id()=generate-id(current())
)]"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match="het" mode="level3">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
  </xsl:copy>
 </xsl:template>

Regards,
Americo Albuquerque

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> james walker
> Sent: Monday, September 29, 2003 1:00 PM
> To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] restructuring element hierarchy using xslt
> 
> 
> 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.
> 
> _________________________________________________________________
> Get Hotmail on your mobile phone http://www.msn.co.uk/msnmobile
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


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



Current Thread
Keywords