XSL : Trie spécifique

XSL : Trie spécifique - XML/XSL - Programmation

Marsh Posté le 15-06-2005 à 09:52:14    

   Bonjour,
 
Voilà, j'ai un XML du type :
<info>
  <nom>...</nom>
  <date>05/09/2005</date>
</info>
<info>
  <nom>...
  <date>08/09/2005</date>
</info>
<info>
  <nom>...
  <date>cloturée</date>
</info>
...
 
Voilà, j'aimerai trier mes dates en ordre décroissant, pour obtenir l'ordre :  
       08/09/2005  
       05/09/2005  
       cloturée
 
Le problème est que quand je trie par date de cet facon :
       <xsl:sort select="substring(date,7,4)" order="descending"/> <!-- year  -->
       <xsl:sort select="substring(date,4,2)" order="descending"/> <!-- month -->
       <xsl:sort select="substring(date,1,2)" order="descending"/> <!-- day   -->  
 
j'obtient :
       cloturée
       08/09/2005
       05/09/2005
 
Merci de m'aiguiller, ...
 
                     Tchoo, Joey

Reply

Marsh Posté le 15-06-2005 à 09:52:14   

Reply

Marsh Posté le 15-06-2005 à 09:58:27    

Personne n'a une petite idée ???

Reply

Marsh Posté le 15-06-2005 à 10:15:11    

J'ai vu qu'il existe des regroupements ? Ce serait peut etre une possibilite ????
 
Comment ca marche ???
 
MERCI ENCORE

Reply

Marsh Posté le 15-06-2005 à 10:39:03    

Je pense que le problème c'est le contenu pas très orthodoxe de ta balise date...  
 
dans une base de données traditionnelle un champ est soit du caractère soit du numérique, ici ton substring va au mieux être évalué comme étant 0 donc les dates cloturées passent avant les autres...
 
Perso je solutionnerais le problème en faisant deux selections parmis les dates, les non cloturées qu'on va trier et les cloturées dont ont se fiche royalement!
 

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<root>
<info>
  <nom>nom1</nom>
  <date>05/09/2005</date>
</info>
<info>
  <nom>nom2</nom>
  <date>08/09/2005</date>
</info>
<info>
  <nom>nom3</nom>
  <date>cloturée</date>
</info>  
</root>
<!-- eof -->


 
et le 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 encoding="iso-8859-1" method="text" omit-xml-declaration="yes" indent="yes"/>  
 
<xsl:template match="/">
  <xsl:apply-templates select="//info[ date != 'cloturée']">
    <xsl:sort  
      select="concat( substring( date,7,4), substring( date,4,2), substring( date,1,2))"  
      order="descending"
    />
  </xsl:apply-templates>
  <xsl:apply-templates select="//info[ date = 'cloturée']">
  </xsl:apply-templates>
</xsl:template>  
 
<xsl:template match="info">
  <xsl:value-of select="date" />  
  <xsl:text> </xsl:text>
  <xsl:value-of select="nom" />  
  <xsl:text>
</xsl:text>
</xsl:template>  
 
</xsl:stylesheet>  
<!-- eof -->


 
J'ai pas creusé mais il y a aussi moyen de faire des tri à l'aide d'xsl:key ( c'est une sorte d'index qu'on définit sur le xml, c'est utile pour de gros tri où une utilisation fréquente). Apparemment vu la taille du problème le xsl:sort suffit largement, il ne va pénaliser les temps d'exécutions.
 
 :jap:


Message édité par avander le 15-06-2005 à 10:40:45
Reply

Marsh Posté le 15-06-2005 à 10:54:31    

Merci...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed