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 :

[XSL] Trier les données en fonctions des parametres?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut [XSL] Trier les données en fonctions des parametres?
    Bonjour,

    J'ai déja réaliser une partie de ce que je voulais réaliser mais j'ai encore un petit probleme.

    Je vous explique mon probleme, Alors en fait un utilisateur va devoir choisir 2 langues(ou x langues),enfin 1 langue dans une liste et une autre langue dans une autre liste...(ou plusieurs autres listes).

    Je récupere ensuite la langue des listes en parametres,que je transmets à php et que je transmets ensuite à ma feuille de style XSL pour creer un fichier XML en fonction de ces parametres.

    En fait j'ai bien le fichier de sortie que je veux mais je voudrai avoir maintenant l'ordre dans lequel j'ai selectionné mes langues,en effet mais parametres sont "ls","lt","lt2","lt3","lt4","lt5"...et j'aimerai que la langue qui corresponde à "ls" soit toujours la 1ere,celle qui correspond à "lt" toujours la deuxieme,etc...

    Je pense que ce n'est pas tres clair car je n'arrive pas bien à expliquer mon idée mais je vais vous mettre le code en didans ce que j'attends en entrée et en sortie.

    En entrée j'ai un fichier XML de ce type :

    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"?>
     <rows>
    	<row id="0">
    		<cell xml:lang="en"><![CDATA[English sentence 1]]></cell>
    		<cell xml:lang="fr"><![CDATA[Phrase Francaise 1]]></cell>
                    <cell xml:lang="sp"><![CDATA[Phrase Espagnol 1]]></cell>
                    <cell xml:lang="jp"><![CDATA[Phrase Japonaise 1]]></cell>
                    <cell xml:lang="it"><![CDATA[Phrase Italienne 1]]></cell>
                    <cell xml:lang="ar"><![CDATA[Phrase Arabe 1]]></cell>
    	</row>
     
    	<row  id="1">
    		<cell xml:lang="en"><![CDATA[English sentence 2]]></cell>
    		<cell xml:lang="fr"><![CDATA[Phrase Francaise 2]]></cell>
                    <cell xml:lang="sp"><![CDATA[Phrase Espagnole 2]]></cell>
                    <cell xml:lang="jp"><![CDATA[Phrase Japonaise 2]]></cell>
                    <cell xml:lang="it"><![CDATA[Phrase Italienne 2]]></cell>
                    <cell xml:lang="ar"><![CDATA[Phrase Arabe 2]]></cell>
    	</row>
     
    </rows>
    Les <![CDATA[..]]> , c'est pour pouvoir lire les effets visuels mais ce n'est pas tres important pour l'instant.

    Et en fait j'aimerai que si l'utilisateur choisisse Arabe en 1ere langue donc "ls"="ar" et Espagnol en 2eme langue donc "lt"="sp" celà ne prenne que les balise de ces langues et renvoie un XML ordonné de la forme:


    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
     
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <rows>
     	<row id="0">
     		<cell xml:lang="ar"><![CDATA[Phrase Arabe 1]]></cell>
                    <cell xml:lang="sp"><![CDATA[Phrase Espagnole 1]]></cell>
             </row>
     
    	<row  id="1">
     		<cell xml:lang="ar"><![CDATA[Phrase Arabe 2]]></cell>
                    <cell xml:lang="sp"><![CDATA[Phrase Espagnole 2]]></cell>
             </row>
     
    </rows>
    car pour l'instant j'obtiens celà:

    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
     
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <rows>
     	<row id="0">
     		<cell xml:lang="sp"><![CDATA[Phrase Espagnole 1]]></cell>
                    <cell xml:lang="ar"><![CDATA[Phrase Arabe 1]]></cell>
             </row>
     
    	<row  id="1">
     		<cell xml:lang="sp"><![CDATA[Phrase Espagnole 2]]></cell>
                    <cell xml:lang="ar"><![CDATA[Phrase Arabe 2]]></cell>
             </row>
     
    </rows>
    Voilà et j'obtiens celà avec ce code XSL:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="xml"  encoding="UTF-8" indent="yes" />
     
    <xsl:param name="ls" />
    <xsl:param name="lt" />
     
    <xsl:template match="rows">
     
    <rows>  
    <xsl:for-each select="row">  
    <row id='{position()-1}'>  
    <xsl:apply-templates select="cell" />  
    </row>  
    </xsl:for-each>  
    </rows>
    </xsl:template>
     
    <xsl:template match="cell">
    	<xsl:variable name="lang" select="@xml:lang"/>
    	<xsl:if test="$lang=$ls">
    	<cell xml:lang='{$lang}'>
    	<xsl:value-of select="." />
        </cell>	
    	</xsl:if>
    	<xsl:if test="$lang=$lt">
    	<cell xml:lang='{$lang}'>
    	<xsl:value-of select="." />
        </cell>	
    	</xsl:if>
     
    </xsl:template>
     
    </xsl:stylesheet>
    Je vous donne aussi mon code PHP si ca peut intérésser certain de passer des parametres à une feuille XSL:

    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
    24
    25
     
    <?php
     
    $ls=$_POST["ls"];
    $lt=$_POST["lt"];
     
    $xh = xslt_create();
    $filebase = 'file://' . getcwd () . '/test/';
    xslt_set_base($xh,$filebase);
     
    $xml = "SOURCE-XML.xml";
    $xsl = "filtreXML.xsl";
    touch("SOURCE-P-XML.xml");
    $resultdoc ="SOURCE-P-XML.xml" ;
     
    $parameters = array('ls' => $ls,'lt' => $lt);
     
    $result = xslt_process($xh,$xml,$xsl,$resultdoc,NULL,$parameters);
    if (!$result)
    {
        die(sprintf("Cannot process XSLT document [%d]: %s",xslt_errno($xh), xslt_error($xh)));
    }
    echo "Result: ".$result."<br />";
    xslt_free($xh);
    ?>
    Voilà,j'espere que c'est plus clair,en fait il m'aurait fallu quelque choses sous XSL pour trier mais en fonction de mes parametres....donc si vous connaissez quelque chose de ce genre,c'est avec grand plaisir!!!

    Merci

  2. #2
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Ça devrait fonctionner :
    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
    24
    25
    26
    27
    28
    29
    30
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="xml"  encoding="UTF-8" indent="yes" />
     
    <xsl:param name="ls" />
    <xsl:param name="lt" />
      
    <xsl:template match="rows">
     
    <rows>  
    <xsl:for-each select="row">  
    <row id='{position()-1}'>  
    <xsl:for-each select="cell">
    <xsl:sort select="@xml:lang" />
    <xsl:choose>
      <xsl:when test="@xml:lang=$ls">
    	<xsl:copy-of select="." />
      </xsl:when>
      <xsl:when test="@xml:lang=$lt">
    	<xsl:copy-of select="." />
      </xsl:when>
    </xsl:choose>
    </xsl:for-each>
    </row>  
    </xsl:for-each>  
    </rows>
    </xsl:template>
     
    </xsl:stylesheet>

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Merci de cette réponse,
    Néanmoins il tri bien mes parametres mais dans l'ordre alphabétique.
    Et en fait je voudrai que mon ordre soit ls>lt>lt2>lt3>lt4>lt5 , comme celà le ls serait toujours mis en premiere position et les autres à la suite....mais je ne sais pas si c'est possible de définir un ordre comme celà...ce que j'ai penser faire c'est aussi d'abord insérer le ls et une fois ca fait..in sérer le lt..etc etc..je vais essayer de me pencher la dessus car en fait le tri je ne pense pas que ca marche!!
    Enfin merci bien pour cette réponse quand meme!!

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Il faut savoir que dans le select du xsl:sort tu peux faire des substring, des concat de plusieurs champs, des translate etc....

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Merci de ta réponse Erwy mais je ne comprends pas bien ce que tu veut dire,en fait à quoi ca me servirai d'utiliser des substring, des concat de plusieurs champs, des translate etc.... ,il y a peut-etre un interet mais je ne le vois pas là directement.

    Sinon j'ai essayé de faire des if imbriqué mais ca n'a pas l'air de marcher avec XSL...je voulais faire un truc du genre if(@xml:lang=$ls){alors ecrire ce que je veux et if(@xml:lang=$lt) {alors ecrire ce que je veux}} comme ca d'abord ca écrivais la langue du ls et ensuite celle du lt..mais apparement ca marche pas la..où je m'y suis mal pris...

    C'est pour celà que je suis intrigué par le sort,j'ai essayé de change le mode du sort mais je n'arrive pas à définir un ordre..enfin je vais essayer de chercher encore...

  6. #6
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par titoff85
    Merci de ta réponse Erwy mais je ne comprends pas bien ce que tu veut dire,en fait à quoi ca me servirai d'utiliser des substring, des concat de plusieurs champs, des translate etc.... ,il y a peut-etre un interet mais je ne le vois pas là directement.
    Et bien j'espère que cet exemple sera plus parlant, car je ne pourrais pas compléter avant plusieurs jours
    XML d'entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <r>
    	<b>a</b>
    	<b>b</b>
    	<b>c</b>
    	<b>d</b>
    	<b>e</b>
    </r>
    XSLT
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:variable name="a1" select="'b'"/>
    	<xsl:variable name="a2" select="'a'"/>
    	<xsl:variable name="a3" select="'d'"/>
    	<xsl:variable name="a4" select="'e'"/>
    	<xsl:variable name="a5" select="'c'"/>
    	<xsl:template match="/">
    		<em>
    			<xsl:apply-templates select="*/*">
    				<xsl:sort select="number(concat(number(.=$a1),number(.=$a2),number(.=$a3),number(.=$a4),number(.=$a5)))" order="descending"/>
    			</xsl:apply-templates>
    		</em>
    	</xsl:template>
    	<xsl:template match="*">
    		<xsl:copy-of select="."/>
    	</xsl:template>
    </xsl:stylesheet>
    XML de sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <em>
    <b>b</b>
    <b>a</b>
    <b>d</b>
    <b>e</b>
    <b>c</b>
    </em>

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    Merci pour ta réponse plus détaillé Erwy,néanmoins celà ne m'a pas permi de trouver la solution par cette maniere.....j'ai pas mal galéré avec les endroits où je pouvais mettre ma fonction de tri etc...le probleme est que j'avais déja des xsl:for-each donc il fallait que je mette ma fonction de tri juste apres..et lorsque je mettais <xsl:sort select="number(concat(number(.=$ls),number(.=$lt)))"order="descending"/>
    il ne me le prennai pas en compte.


    Mais j'ai quand meme trouvé la solution en allant voir les options de la fonction xsl:sort et j'ai vu qu'il était possible de mettre plusieurs clés de tri.

    Je vous mets donc la solution si ca peu servir à quelqu'un,et encore merci à Strat0 et Erwy pour leur aide.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="xml"  encoding="UTF-8" indent="yes" />
     
    <xsl:param name="ls" />
    <xsl:param name="lt" />
    <xsl:param name="lt2" />
     
    <xsl:template match="rows">
     
    <rows>  
    <xsl:for-each select="row">  
    <row id='{position()-1}'>  
    <xsl:for-each select="cell">
     
    <xsl:sort select="@xml:lang=$lt2" />
    <xsl:sort select="@xml:lang=$lt" />
    <xsl:sort select="@xml:lang=$ls" />
     
    <xsl:choose>
      <xsl:when test="@xml:lang=$ls">
    	<xsl:copy-of select="." />
      </xsl:when>
      <xsl:when test="@xml:lang=$lt">
    	<xsl:copy-of select="." />
      </xsl:when>
      <xsl:when test="@xml:lang=$lt2">
    	<xsl:copy-of select="." />
      </xsl:when>
    </xsl:choose>
    </xsl:for-each>
    </row>  
    </xsl:for-each>  
    </rows>
    </xsl:template>
     
    </xsl:stylesheet>
    et avec celà j'obtiens bien un fichier de sortie de la forme (j'ai remplacé les langues par les parametres pour que ce soit compréhensible):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <rows>
      <row id="0">
        <cell xml:lang="$ls">Phrase 1 dans la langue ls </cell>
        <cell xml:lang="$lt">Phrase 1 dans la langue lt</cell>
        <cell xml:lang="$lt2">Phrase 1 dans la langue lt2</cell>
      </row>
      <row id="1">
        <cell xml:lang="$ls">Phrase 2 dans la langue ls </cell>
        <cell xml:lang="$lt">Phrase 2 dans la langue lt</cell>
        <cell xml:lang="$lt2">Phrase 2 dans la langue lt2</cell>
      </row>
    </rows>
    Voilà,bonne journée et bon week-end et bonne vacances pour certains

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2008, 22h12
  2. Trier les données dans 1 tableau par ordre décroissant
    Par Blunet dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 23/11/2005, 09h56
  3. Trier les données d'un TDecisionCube
    Par kinettoman dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/09/2004, 10h31
  4. Trier les enregistrements en fonction de la date
    Par mpereg dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 12/09/2004, 14h16
  5. trier les données dans le cache ??
    Par psyco2604 dans le forum XSL/XSLT/XPATH
    Réponses: 31
    Dernier message: 10/06/2003, 10h03

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