Re: sort, count, number, group

Subject: Re: sort, count, number, group
From: Michel CASABIANCA <casa@xxxxxx>
Date: 12 Mar 2000 14:39:30 +0100
Hello

quagly <quagly@xxxxxxxx> writes:
>     After perusing the FAQ I can sort, count, number, and group.
>     But I cannot do them all at once.  Please help.
> 
>     Example:
> 
> xml:
> 
> <root>
>     <foo>
>           <bar>bard</bar>
>           <bar>bark</bar>
>     </foo>
>     <foo>
>           <bar>bark</bar>
>           <bar>barb</bar>
>      </foo>
> </root>
> 
> Sample xsl that selects distinct <bar>
> 
> <xsl:template match="//bar[not(. = following::bar)]">
>      <xsl:value-of select="."/>
> </xsl:template>
> 
> produces:
> 
> bard bark barb
> 
> what I want is to number these, sort them, and count the number of times
> they appear in the xml source
> 
> Desired output:
> 
> 1.  barb  -1
> 2.  bard  -1
> 3.  bark  -2
> 
> I can't seem to get there from here.  Do I need to use for-each?

I did it with this stylesheet :

---------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:for-each select="//bar">
      <xsl:variable name="value" select="."/>
      <xsl:if test="count(preceding::bar[.=$value]) = 0">
	<xsl:value-of select="."/><xsl:text> : </xsl:text>
	<xsl:value-of select="count(//bar[.=$value])"/>
	<xsl:text>&#xA;</xsl:text>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>
----------------------------

producing the following output :

bard : 1
bark : 2
barb : 1

-- 
+---------------------------+--------------------------------+
| Michel CASABIANCA         | http://www.sdv.fr/pages/casa   |
| mailto:casa@xxxxxx        | Articles sur Java et XML       |
| Développement Java et XML | Applications et Applets de Jeu |
+---------------------------+--------------------------------+


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


Current Thread