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 :

Récupération de données une fois triées [XSLT 2.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Points : 2 913
    Points
    2 913
    Par défaut Récupération de données une fois triées
    Bonjour,

    J'aimerai extraire et mettre en forme différentes données d'un fichier XML, le tout dans un certain ordre.

    Plutôt que de prendre le risque (très probable) de rendre mon explication obscure et peu claire si je détaille plus, je préfère directement vous donner un ficher XML à titre d'exemple (avec son XSD si ça peut aider).

    Le XML donc :
    Code xml : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    <Document>
      <Header>
        <Criteres>
          <Critere>
            <Flags>
              <Flag>
                <Types>
                  <Type>
                    <Libele>Ordre</Libele>
                    <Valeur>2</Valeur>
                  </Type>
                  <Type>
                    <Libele>Nom</Libele>
                    <Valeur>toto</Valeur>
                  </Type>
                  <Type>
                    <Libele>Type</Libele>
                    <Valeur>int</Valeur>
                  </Type>
                </Types>
              </Flag>
              <Flag>
                <Types>
                  <Type>
                    <Libele>Ordre</Libele>
                    <Valeur>0</Valeur>
                  </Type>
                  <Type>
                    <Libele>Nom</Libele>
                    <Valeur>titi</Valeur>
                  </Type>
                  <Type>
                    <Libele>Type</Libele>
                    <Valeur>string</Valeur>
                  </Type>
                </Types>
              </Flag>
            </Flags>
            <SousCriteres>
              <Critere>
                <Critere>
                  <Flags>
                    <Flag>
                      <Types>
                        <Type>
                          <Libele>Ordre</Libele>
                          <Valeur>3</Valeur>
                        </Type>
                        <Type>
                          <Libele>Nom</Libele>
                          <Valeur>tutu</Valeur>
                        </Type>
                        <Type>
                          <Libele>Type</Libele>
                          <Valeur>char</Valeur>
                        </Type>
                      </Types>
                    </Flag>
                    <Flag>
                      <Types>
                        <Type>
                          <Libele>Ordre</Libele>
                          <Valeur>1</Valeur>
                        </Type>
                        <Type>
                          <Libele>Nom</Libele>
                          <Valeur>tata</Valeur>
                        </Type>
                        <Type>
                          <Libele>Type</Libele>
                          <Valeur>double</Valeur>
                        </Type>
                      </Types>
                    </Flag>
                  </Flags>
                  <SousCriteres />
                </Critere>
              </Critere>
            </SousCriteres>
          </Critere>
        </Criteres>
      </Header>
      <Bodys>
        <Body>
          <!-- [...] -->
        </Body>
      </Bodys>
      <Footer>
        <!-- [...] -->
      </Footer>
    </Document>

    le XSD :
    Code xsd : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="Document">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Header" type="ModelType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="Bodys" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element  minOccurs="0" maxOccurs="unbounded" name="Body" type="ModelType" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Footer" type="ModelType" minOccurs="0" maxOccurs="1"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
     
     
      <xs:complexType name="ModelType">
        <xs:sequence>
          <xs:element name="Criteres">
            <xs:complexType>
              <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" name="Critere" type="CritereType" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
     
      <xs:complexType name="CritereType">
        <xs:sequence>
          <xs:element name="Flags">
            <xs:complexType>
              <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" name="Flag" type="FlagType" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="SousCriteres">
            <xs:complexType>
              <xs:sequence >
                <xs:element minOccurs="0" maxOccurs="unbounded" name="Criteres" type="CritereType"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
     
      <xs:complexType name="FlagType">
        <xs:sequence>
          <xs:element name="Types">
            <xs:complexType>
              <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" name="Type" type="TypeType" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
     
      <xs:complexType name="TypeType">
        <xs:sequence>
          <xs:element name="Libele" type="xs:string" />
          <xs:element name="Valeur" type="xs:string" />
        </xs:sequence>
      </xs:complexType>
    </xs:schema>

    A l'issue de la transformation j'aimerai obtenir quelque chose du genre :
    Nom (type)
    Nom (type)
    ...
    pour chaque flag, mais dans un ordre précis (donné par la valeur du type ayant pour libellé "Ordre").

    Avec le XML donné précédemment j'aimerai donc obtenir ceci :
    titi (string)
    tata (double)
    toto (int)
    tutu (char)
    J'ai une "solution", mais qui ne me conviens pas vraiment :
    Code xslt : 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
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt"
        exclude-result-prefixes="msxsl">
     
      <xsl:output method="xml" indent="yes"/>
     
      <xsl:template match="/">
        <xsl:call-template name="for">
          <xsl:with-param name="i" select="0" />
          <xsl:with-param name="max" select="3" />
          <xsl:with-param name="step" select="1" />
        </xsl:call-template>
      </xsl:template>
     
     
      <xsl:template name="for">
        <xsl:param name="i" select="0" />
        <xsl:param name="max" select="0" />
        <xsl:param name="step" select="1" />
     
        <xsl:value-of select="//Critere/Flags/Flag[Types/Type[Libele = 'Ordre']/Valeur = $i]/Types/Type[Libele = 'Nom']/Valeur"/>
        (<xsl:value-of select="//Critere/Flags/Flag[Types/Type[Libele = 'Ordre']/Valeur = $i]/Types/Type[Libele = 'Type']/Valeur"/>)
        <br/>
        <xsl:if test ="$i &lt; $max">
          <xsl:call-template name="for">
            <xsl:with-param name="i" select="$i+$step" />
            <xsl:with-param name="max" select="$max" />
            <xsl:with-param name="step" select="$step" />
          </xsl:call-template>
        </xsl:if>
      </xsl:template>
     
    </xsl:stylesheet>
    En effet ceci ne fonctionne que si tous les "ordres" sont successifs (suite atithmétique) : "0,1,2,3". Dans le cas contraire, "4,8,15,16,23,42" par exemple, ça ne fonctionne plus.

    J'ai donc cherché du côté de <xsl:sort />, mais j'avoue que j'ai un peu de mal :
    j'ai donc testé dans un premier temps ceci :
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:for-each select="//Critere">
      <xsl:sort select="Flags/Flag/Types/Type[Libele = 'Ordre']/Valeur" order="ascending"/>
      <xsl:value-of select="." />
    </xsl:for-each>
    et cela :
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:apply-templates select="//Critere">
      <xsl:sort data-type="number" select="Flags/Flag/Types/Type[Libele = 'Ordre']/Valeur" order="ascending"/>
    </xsl:apply-templates>
    mais dans les deux cas rien n'est trié et j'ai deux fois les critères "tutu" et "tata".

    C'est donc ici que je bloque, et que je fais appel à votre aide. Qu'est-ce que je fais mal / que je n'ai pas compris / que j'ai raté ?

    Merci d'avance pour vos réponses.

    [PS: pardonnez moi si je ne suis pas très réactif à partir de demain : je fais le pont !]

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 563
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 563
    Points : 21 627
    Points
    21 627
    Par défaut
    L'exemple est trop compliqué pour qu'on puisse être bien clair, mais il semble que :

    Pour chaque Critere, tu veux classer ses Flag par ordre croissant, c'est ça ?

    Puisque tu veux classer des Flag, pourquoi tu select des Critere ? Il faut select des Flag.

  3. #3
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Points : 2 913
    Points
    2 913
    Par défaut
    Tu as bien compris, et il faut effectivement sélectionner les flags... J'étais focalisé ailleurs...

    Du coup ça fonctionne très bien comme ça :
    Code xsd : 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
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt"
        exclude-result-prefixes="msxsl">
     
      <xsl:output method="xml" indent="yes"/>
     
      <xsl:template match="/">
        <xsl:for-each select="//Flag">
          <xsl:sort select="Types/Type[Libele = 'Ordre']/Valeur" order="ascending"/>
          <xsl:value-of select="Types/Type[Libele = 'Nom']/Valeur" /> (<xsl:value-of select="Types/Type[Libele = 'Type']/Valeur" />)
          <br/>
        </xsl:for-each>
      </xsl:template>
     
    </xsl:stylesheet>

    Rien de tel qu'un regard neuf !

    Merci beaucoup !

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

Discussions similaires

  1. GWT Récupération de données à une heure précise
    Par Jacky31 dans le forum GWT et Vaadin
    Réponses: 5
    Dernier message: 13/07/2010, 11h10
  2. Récupération de données en SQL et tri dans une liste
    Par skurty dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/03/2010, 23h55
  3. Access supprimer les données une fois envoyer par messagerie
    Par lolocdm dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/10/2008, 08h30
  4. Réponses: 3
    Dernier message: 31/03/2008, 12h35
  5. supprimer des données une fois la date passée
    Par Bazooka dans le forum Access
    Réponses: 2
    Dernier message: 09/02/2007, 21h39

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