xsl-list
[Top] [All Lists]

Re: Re: Using XSL for a "world records" table

2003-05-18 01:51:10
Sorry, I'm still sleepy this Sunday morning.

Use the following transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 <xsl:output omit-xml-declaration="yes"/>

  <xsl:key name="kByTime" match="record"
  use="time"/>

  <xsl:template match="/">
    <xsl:for-each
     select="/*/record[generate-id()
                      =
                       generate-id(key('kByTime',
                                        time
                                       )[1]
                                   )
                       ]">
       <xsl:sort select="time" data-type="number"/>
       <xsl:variable name="groupPos"
       select="1 + count(/*/record[time &lt; current()/time])"/>

       <xsl:for-each select="key('kByTime', time)">
         <xsl:sort select="@date" data-type="number"/>
         <xsl:text>&#xA;</xsl:text>
         <xsl:value-of select="$groupPos"/>
         <xsl:copy-of select="."/>
       </xsl:for-each>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

When applied on this source.xml:

<records>
 <record name="abc" date="20011130">
   <time>12</time>
 </record>
 <record name="abc" date="19991130">
   <time>12</time>
 </record>
 <record name="abc" date="20011130">
   <time>18</time>
 </record>
 <record name="abc" date="20011130">
   <time>11</time>
 </record>
 <record name="abc" date="19991130">
   <time>11</time>
 </record>
 <record name="abc" date="20011130">
   <time>22</time>
 </record>
 <record name="abc" date="20011130">
   <time>15</time>
 </record>
</records>

The wanted result is produced:


1<record name="abc" date="19991130">
   <time>11</time>
 </record>
1<record name="abc" date="20011130">
   <time>11</time>
 </record>
3<record name="abc" date="19991130">
   <time>12</time>
 </record>
3<record name="abc" date="20011130">
   <time>12</time>
 </record>
5<record name="abc" date="20011130">
   <time>15</time>
 </record>
6<record name="abc" date="20011130">
   <time>18</time>
 </record>
7<record name="abc" date="20011130">
   <time>22</time>
 </record>


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL
"Dimitre Novatchev" <dnovatchev(_at_)yahoo(_dot_)com> wrote in message
news:ba7flb$344$1(_at_)main(_dot_)gmane(_dot_)org(_dot_)(_dot_)(_dot_)
Thanks Dimitre. It almost works with grouping, but now the record in 3rd
place is listed as 2nd place. That is:

Place   Time         Name
1       11 seconds   Person 1
1 11 seconds   Person 2
2       12 seconds   Person 3

My code looks like this:

<xsl:for-each select="record[count(. | key('records-by-time', time)[1])
=
1]">
 <xsl:sort data-type="number" select="time"/>
 <xsl:apply-templates select="key('records-by-time', time)">
  <xsl:with-param name="place" select="position()"/>
 </xsl:apply-templates>
</xsl:for-each>

As you see, I'm using the value of position() for place.

Do you know of any way to get around this?

Hi Ryan,

Use something like this:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 <xsl:output omit-xml-declaration="yes"/>

  <xsl:key name="kByTime" match="record"
  use="time"/>

  <xsl:template match="/">
    <xsl:for-each
     select="/*/record[generate-id()
                      =
                       generate-id(key('kByTime',
                                        time
                                       )[1]
                                   )
                       ]">
       <xsl:sort select="time" data-type="number"/>
       <xsl:for-each select="key('kByTime', time)">
         <xsl:sort select="@date" data-type="number"/>
         <xsl:text>&#xA;</xsl:text>
         <xsl:value-of select="position() + count(/*/record[time &lt;
current()/time])"/>
         <xsl:copy-of select="."/>
       </xsl:for-each>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

When applied on this source.xml (you never provided your original xml, so
I
use my own here):

<records>
 <record name="abc" date="20011130">
   <time>12</time>
 </record>
 <record name="abc" date="19991130">
   <time>12</time>
 </record>
 <record name="abc" date="20011130">
   <time>18</time>
 </record>
 <record name="abc" date="20011130">
   <time>11</time>
 </record>
 <record name="abc" date="19991130">
   <time>11</time>
 </record>
 <record name="abc" date="20011130">
   <time>22</time>
 </record>
 <record name="abc" date="20011130">
   <time>15</time>
 </record>
</records>

The wanted result is produced:


1<record name="abc" date="19991130">
   <time>11</time>
 </record>
2<record name="abc" date="20011130">
   <time>11</time>
 </record>
3<record name="abc" date="19991130">
   <time>12</time>
 </record>
4<record name="abc" date="20011130">
   <time>12</time>
 </record>
5<record name="abc" date="20011130">
   <time>15</time>
 </record>
6<record name="abc" date="20011130">
   <time>18</time>
 </record>
7<record name="abc" date="20011130">
   <time>22</time>
 </record>


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list






 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list