Re: [xsl] Re: Adjusting sorted list

Subject: Re: [xsl] Re: Adjusting sorted list
From: Andrew Timberlake <andrew.lists@xxxxxxxxx>
Date: 16 May 2002 18:42:37 +0200
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@xxxxxxxxx
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


Current Thread