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 :

[XSLT] Sélectionner des valeurs distinctes


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut [XSLT] Sélectionner des valeurs distinctes
    Bonjour,

    Je voudrais transformer une structure arborescente en structure linéaire (en ne gardant que les éléments qui m'intéressent) pour ensuite pouvoir vérifier qu'un élément est (ou non) déjà présent dans le document.

    Je m'explique. Je voudrais partir d'un document 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
    MEMBRE
      |--D610 nomD610="d1"
      |    |
      |    |--D710
      |    |    
      |    |--D610 nomD610="d2"
      |    |    |--D710
      |    |    |--D710
      |    |    |--D610 nomD610="d3"
      |    |
      |    |--D710
      |    |
      |    |--D610 nomD610="d4"
      |    |    |--D610 nomD610="d1"
      |    |          |--D710
      |    |


    Pour arriver à un document comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MEMBRE
      |
      |--D610 nomD610="d1"
      |
      |--D610 nomD610="d2"
      | 
      |--D610 nomD610="d3"
      | 
      |--D610 nomD610="d4"
      | 
      |--D610 nomD610="d1"
      |

    Une fois ici j'aimerais faire un tri pour que le 2ème D610 de valeur "d1" soit éliminé (j'avais pensé à la fonction preceding), de manière à pouvoir afficher tous les D610 sans faire de doublon.
    J'ai vu qu'il y avait déjà un post qui traiter de comment applatir un document, mais je n'ai pas su le réutiliser pour le mettre à ma sauce.
    Comme je débute, je ne sais pas si ce que je veux faire est réellement faisable, mais si vous pouviez me donner quelques indications.

    Merci d'avance


    PS : j'avais pensé à utiliser la méthode de Muench, mais je n'ai pas réussi non plus. Et j'ai pensé qu'il serait finalement peut-être plus simple de procéder ainsi. Mais je reste ouvert à la méthode de Muench

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    pourrais-tu préciser quel est ton objectif de départ ? Parce que les conditions qui nécessitent absolument 2 transformations XSLT pour arriver à ce qu'on veut sont rares et concernent des cas complexes, et je ne pense pas qu'on soit dans ce cas ici.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut
    A la base mon objectif est de sélectionner l'ensemble des D610 (et ce qu'ils contiennent) en éliminant les doublons.

    Mais du fait qu'un D610 peut contenir un autre D610, j'avais pensé tout mettre en structure linéaire.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut
    Voici un exemple de code (court mais qui reprend l'ensemble des possibilités).

    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
    <membre>
      <D610 nomD610="d1">
        <D710 nomD710="e1"></D710>
        <D710 nomD710="e2">
          <codeC>1595</codeC>
        </D710>
        <D610 nomD610="d2">
          <D610 nomD610="d3">
            <D710 nomD710="e3">
              <codeC>1595</codeC>
            </D710>
            <D710 nomD710="e4">
              <codeC>1706</codeC>
            </D710>
            <D710 nomD710="e5">
              <codeC>1706</codeC>
            </D710>
            <D710 nomD710="e6">
              <codeC>1595</codeC>
            </D710>
          </D610>
        </D610>
      </D610>
    </membre>


    Objectif :

    J'ai un champs texte (input type="text") dans lequel j'entre un codeC, ce qui lance un traitement.
    Ce traitement a pour but d'éliminer les D710 de même niveau qui ont des codeC égaux pour n'afficher (une fois le traitement fini) qu'une seule fois l'élément D610.



    Ex1 :

    - j'entre le codeC "1706"
    - il y a deux codeC "1706" dans le D610 "d3"
    - en sortie, j'obtiens une seule ligne me disant que le D610 "d3" contient un codeC "1706"




    Ex2 :

    - j'entre le codeC "1595"
    - il y a deux codeC "1595" dans le D610 "d3" et un codeC "1595" dans le D610 "d1"
    - en sortie, j'obtiens 2 lignes : l'une disant que le D610 "d1" contient un codeC "1595", et l'autre disant que le D610 "d3" contient un codeC "1595".

  5. #5
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    Désolé de le dire comme cela mais ce traitement ne mérite même pas une transformation...

    Car voici ce que l'on peut faire en transformation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     <xsl:stylesheet version="1.0" txs:name="codeC">
      <xsl:output method="text"/>
      <xsl:template match="/">
       <xsl:variable name="v" select="1595"/>
       <xsl:for-each select="//D610[D710/codeC = $v]">
        <xsl:value-of select="@nomD610"/><xsl:text>
    </xsl:text>
       </xsl:for-each>
      </xsl:template>
      </xsl:template>
     </xsl:stylesheet>
    C'est certainement tout aussi simple en DOM de sélectionner tous les noeuds vérifiant la condition et, pour chacun, de récupérer l'attribut voulu !

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut
    Moins c'est compliqué mieux c'est je dirais. S'il n'y a pas besoin de tranformation, alors ...
    Bon je suis en train de l'intéger à mon code. Ca ne marche pas encore tout à fait, mais il rechigne moins que toute à l'heure.
    Merci à toi

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut
    Citation Envoyé par alain.couthures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       <xsl:variable name="v" select="1595"/>
       <xsl:for-each select="//D610[D710/codeC = $v]">
        <xsl:value-of select="@nomD610"/><xsl:text>
    </xsl:text>
       </xsl:for-each>
    Euh ... Ce code ne récupérerait-il pas tous les D710 qui ont un codeC égal à 1595 ? En fait ce qu'il me faudrait c'est qu'il me sélectionne uniquement les D710 appartenant à des D610 différents.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/05/2008, 16h24
  2. [XSLT] Affichage des valeurs en fonction d'autres
    Par devlo2006 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 08/04/2008, 18h28
  3. Réponses: 6
    Dernier message: 29/08/2007, 06h49
  4. [XSLT] Normalisation des valeurs pour les URL
    Par camboui dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 10/01/2006, 12h33
  5. [xslt] filtrer des valeurs numériques
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/09/2005, 12h01

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