IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

Tri XSLT sans boucle


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Invité
    Invité(e)
    Par défaut Tri XSLT sans boucle
    Bonjour,

    Je récupère un flux xml contenant des news et je voudrais n'afficher que la dernière news par ordre de date de publication.
    Comment faire ?
    je sais ordonner des éléments dans un <xsl:for-each> avec un <sort> mais là il ne s'agit pas d'une foreach. je veux juste accéder à la dernière news.
    je peux évidement faire une boucle, trier et n'afficher que le premier mais y'a plus simple / propre ?
    d'avance merci

  2. #2
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Bonjour,

    tu peux t'inspirer du code suivant :

    Le XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <DATA>
    	<FICHE nom="toto" date="22/03/2008" description="blabla" />
    	<FICHE nom="tata" date="20/10/2010" description="blibli" />
    	<FICHE nom="tutu" date="12/01/2010" description="blublu" />
    </DATA>
    La template XSLT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:apply-templates select="element">
    	<xsl:sort select="concat(substring((@*[name() = $sortby])[$typeTri='date'], 7, 4),substring((@*[name() = $sortby])[$typeTri ='date'], 4, 2),substring((@*[name() = $sortby])[ $typeTri ='date'], 1, 2))  " order="ascending" data-type="text"/>
    	<xsl:sort select="(@*[name() = $sortby])[ $typeTri !='date']" order="ascending" data-type="text"/>
    </xsl:apply-templates>
    Ce code avait été proposé par Erwy.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci polymorphisme

    donc la seule autre solution est de passer par un template ?!
    je pensais qu'il y avait plus simple encore :/

  4. #4
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    la dernière news par ordre de date de publication.
    En fait, je suis étonné que tu cherche à faire un tel tri
    puisque dans un flux RSS, la dernière nouvelle en date
    correspond à la première nouvelle du flux !
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par polymorphisme Voir le message
    puisque dans un flux RSS, la dernière nouvelle...
    justement il ne s'agit pas d'un flux RSS mais d'une liste de news saisies pas l'utilisateur. comme la date de création ne correspond pas forcément à la date de publication de la news et que je veux afficher sur la home page uniquement la news la plus récente, je dois trier ma liste pour afficher la bonne news.

    je vais me débrouiller avec un template ou une boucle suivant ce qui est plus simple à mettre en place

    merci

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Hello,
    Montre nous ton code, on te dira si c'est simplifiable.

    Et au passage, ne pas utiliser les templates, c'est ce compliquer la vie dans 90% des cas. Ne pas les utiliser c'est en général passer à coté de la construction logique d'un xslt.

  7. #7
    Invité
    Invité(e)
    Par défaut
    ben pour l'instant j'ai pas vraiment de code .

    pour simplifier j'ai un noeud parent avec des sous-noeuds actus qui contiennent un titre et une date.


    <noeud>
    <actu>
    <titre>Actu 2</titre>
    <date>15/07/2010</date>
    </actu>
    <actu>
    <titre>Actu 1</titre>
    <date>19/07/2010</date>
    </actu>
    <actu>
    <titre>Actu 3</titre>
    <date>12/07/2010</date>
    </actu>
    <actu>
    <titre>Actu 4</titre>
    <date>21/07/2010</date>
    </actu>
    </noeud>


    ce que je veux c'est afficher une seule actu, la dernière en date.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    C'est un peu compliqué de trier, puis n'afficher que le premier élément.
    On s'en sort avec les extentions exsl qui fonctionnent sur la pluspart de processeur XLST (Je ne sais pas, ce que tu utilises).

    XSLT 1.0, ne connait pas le format date. Il faut donc ici reformater la chaine pour pouvoir la trier.
    Ca donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
       xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl">
    	<xsl:template match="/">
    		<res>
    			<xsl:variable name="orderedActus">
    				<tri>
    					<xsl:apply-templates select="noeud/actu"  mode="intern">
    						<xsl:sort select="concat(substring(date,7,11),substring(date,3,5),substring(date,1,2))"
    						order="descending" data-type="text"/>
    					</xsl:apply-templates>
    				</tri>
    			</xsl:variable>
     
    			<xsl:copy-of select="exsl:node-set($orderedActus)/tri/actu[1]"/>
    		</res>
    	</xsl:template>
     
    	<xsl:template match="actu" mode="intern">
    		<xsl:copy-of select="."/>
    	</xsl:template>
     
    </xsl:stylesheet>

  9. #9
    Invité
    Invité(e)
    Par défaut
    Oula ca me parait pas plus simple que ma solution avec un foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsl:for-each select="//actu">
        <xsl:sort select="./date" order="descending" />    
     
        <xsl:if test="position() = 1">
                 <xsl:value-of select="/titre" /><br />
        </xsl:if>
    </xsl:for-each>

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Oula, oui, t'as bien raison!
    Mais pour ton tri, je conseille quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:sort select="concat(substring(date,7,11),substring(date,3,5),substring(date,1,2))"
    Sinon dès que le mois change, le tri sera faux.

  11. #11
    Invité
    Invité(e)
    Par défaut
    ah super merci pour l'info !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E] tester la valeur d'une plage de données sans boucle
    Par bibi5883 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/04/2007, 08h36
  2. Tri dans une boucle avec numéros
    Par delavega dans le forum ASP
    Réponses: 1
    Dernier message: 24/11/2006, 13h17
  3. [VBA-E] Modifier le contenu d'un range sans boucle
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/04/2006, 11h19
  4. créer des liens automatiquement mais sans boucle
    Par psychoBob dans le forum Langage
    Réponses: 8
    Dernier message: 15/12/2005, 15h20
  5. "try...except" sans message d'erreur
    Par SchpatziBreizh dans le forum Langage
    Réponses: 4
    Dernier message: 12/07/2005, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo