This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Re: Adjusting sorted list
- From: Andrew Timberlake <andrew dot lists at ddd dot co dot za>
- To: xsl-list at lists dot mulberrytech dot com
- Date: 16 May 2002 18:42:37 +0200
- Subject: Re: [xsl] Re: Adjusting sorted list
- References: <20020516145821.90963.qmail@web14502.mail.yahoo.com>
- Reply-to: xsl-list at lists dot mulberrytech dot com
I've been playing with this idea and have created an interesting side
effect.
Using source:
<root>
<a>
<b val="4">four</b>
<b val="9">nine</b>
<b val="6">six</b>
<b val="1">one</b>
<b val="8">eight</b>
<b val="6">six</b>
<b val="4">four</b>
<b val="7">seven</b>
</a>
<a>
<b val="9">nine</b>
<b val="5">five</b>
<b val="5">five</b>
</a>
</root>
And style sheet:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kRanking" match="b" use="@val"/>
<xsl:template match="/root/a">
<a>
<xsl:for-each select="b[generate-id()
=
generate-id(key('kRanking',@val)[1])
]">
<xsl:sort select="@val" data-type="number"/>
<xsl:variable name="vPos" select="position()"/>
<xsl:for-each select="key('kRanking',@val)">
<b rank="{$vPos}">
<xsl:value-of select="."/>
</b>
</xsl:for-each>
</xsl:for-each>
</a>
</xsl:template>
</xsl:stylesheet>
I now get:
<a>
<b rank="1">one</b>
<b rank="2">four</b>
<b rank="2">four</b>
<b rank="3">six</b>
<b rank="3">six</b>
<b rank="4">seven</b>
<b rank="5">eight</b>
<b rank="6">nine</b>
<b rank="6">nine</b>
</a>
<a>
<b rank="1">five</b>
<b rank="1">five</b>
</a>
What have I done???
Andrew
On Thu, 2002-05-16 at 16:58, Dimitre Novatchev wrote:
> Bellow is the stylesheet that does this:
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:output omit-xml-declaration="yes" indent="yes"/>
>
> <xsl:key name="kRanking" match="b" use="."/>
>
> <xsl:template match="/">
> <a>
> <xsl:for-each select="/a/b[generate-id()
> =
> generate-id(key('kRanking',.)[1])
> ]">
> <xsl:sort select="." data-type="number"/>
>
> <xsl:variable name="vPos" select="position()"/>
>
> <xsl:for-each select="key('kRanking',.)">
> <b rank="{$vPos}">
> <xsl:value-of select="."/>
> </b>
>
> </xsl:for-each>
> </xsl:for-each>
> </a>
> </xsl:template>
> </xsl:stylesheet>
>
> With your source xml it produces exactly the desires result:
>
> <a>
> <b rank="1">1</b>
> <b rank="2">4</b>
> <b rank="2">4</b>
> <b rank="3">6</b>
> <b rank="3">6</b>
> <b rank="4">7</b>
> <b rank="5">8</b>
> <b rank="6">9</b>
> </a>
>
> Hope this helped.
>
> Cheers,
> Dimitre Novatchev.
>
>
>
>
> __________________________________________________
> Do You Yahoo!?
> LAUNCH - Your Yahoo! Music Experience
> http://launch.yahoo.com
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
--
Andrew Timberlake
Digital Design Development
http://www.ddd.co.za
mailto:andrew@ddd.co.za
011 705 1737
082 415 8283
"If debugging is the process of removing bugs,
then programming must be the process of putting them in."
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list