xsl-list
[Top] [All Lists]

RE: restructuring element hierarchy using xslt

2003-09-29 09:46:57
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(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
james walker
Sent: Monday, September 29, 2003 1:00 PM
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
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



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