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