Subject: RE: restructuring element hierarchy using xslt
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 29 Sep 2003 18:20:42 +0100
|
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@xxxxxxxxxxxxxxxxxxxxxx
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of
> Dimitre Novatchev
> Sent: 29 September 2003 15:23
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: 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
|