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 :

Problème d'écriture d'une transformation XSLT avec les boucles de conditions [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Problème d'écriture d'une transformation XSLT avec les boucles de conditions
    Bonjour à tous,

    Je voudrais savoir s'il y a quelqu'un qui peut m'aider à résoudre un problème d'écriture d'une boucle en XSLT, ma question est la suivante :
    Comment je peux écrire une transformation XML vers TXT qui traitera le document XML afin de compter en son sein le nombre d’éléments
    <Name> consécutifs qui ont la même valeur et d’afficher pour chacun des premiers de chaque série ce nombre, une tabulation et cette valeur
    Le document XMl est le suivant :
    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
    40
    41
    42
    43
    44
    45
    46
    <Document>
       <Balise>
          <Name>A</Name>
       </Balise>
       <Balise>
          <Name>A</Name>
       </Balise>
       <Balise>
          <Name>A</Name>
       </Balise>
       <Balise>
          <Name>B</Name>
       </Balise>
       <Balise>
          <Name>B</Name>
       </Balise>
       <Njoueur>
          <Name>B</Name>
       </Balise>
       <Balise>
          <Name>B</Name>
       </Balise>
       <Balise>
          <Name>B<Name>
       </Balise>
       <Balise>
          <Name>B</Name>
       </Balise>
       <Balise>
          <Name>B</Name>
       </Balise>
       <Balise>
          <Name>C</Name>
       </Balise>
       <Balise>
          <Name>C</Name>
       </Balise>
       <Balise>
          <Name>C</sName>
       </Balise>
    ...
       <Balise>
          <Name>Z</Name>
       </Balise>
    ...
    <Document>
    et voici ce que j'ai pu écrire en 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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
        <xsl:output method="texte"/>
        <xsl:template match="Balise">
           <xsl:choose>
               <xsl:when test="Name = not(preceding-sibling::Name)">
                   <xsl:value-of select="Name [position()=1]"/>
                   <xsl:value-of select="count(//Name [ position()='1'])"/>
               </xsl:when>
               <xsl:otherwise>
               </xsl:otherwise>
           </xsl:choose>
        </xsl:template>
    </xsl:stylesheet>
    Merci de votre réponse !

    Cordialement,

  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 : 51
    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,

    et d’afficher pour chacun des premiers de chaque série ce nombre, une tabulation et cette valeur
    je n'ai pas compris ce que tu veux obtenir.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Je voudrais simplement avoir un affichage comme ça :
    A Tabulation 3
    B Tabulation 6
    C Tabulation 3
    ...
    Z Tabulation 1

    En sachant que les noms sont organisé en ordre alphabétique croissant.

    Bien cordialement,

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Dans ce cas c'est plus facile (mais pas super facile quand même) : il faut faire un regroupement Muench.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Regroupement Muench
    Bonjour,

    A vrais dire je ne comprends pas ce que veux-tu dire par regroupement muench, et si tu pares "la méthode Muench" je pense que cette feuille de style ne compte pas le nombre total de chaque nom ainsi leur valeur ???
    J'ai plutôt pensé qu'on doit utilisé des conditions pour repérer chaque nom et la fonction count() pour compter leurs valeurs (leurs nombres).

    Bien cordialement,

  6. #6
    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 : 51
    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
    Pour faire des regroupement, la méthode la plus simple est la méthode Muench.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut des regroupements mais pas de comptage
    J'ai essayé d'appliquer ce que tu m'as montré mais apparemment ça ne fonctionne pas puisque je n'ai pas le nombre de chacun des noms. Et surtout pas le résultat escompté.
    Pour mieux expliqué ce que je veux comme résultat :
    Dans mon document XML, je dois avoir une suite d'éléments <Name> dont les contenus sont des noms triés par ordre alphabétique :
    <Document><Name>A</Name><Name>A</Name><Name>A</Name><Name>B</Name><Name>B</Name><Name>B</Name><Name>B</Name><Name>B</Name><Name>B</Name><Name>C</Name><Name>C</Name><Name>C</Name>...<Name>Y</Name><Name>Y</Name><Name>Z</Name><Document>
    A partir de ce document XML je dois en générer un autre de type TXT dont le contenu sera :
    A Tabulation 3
    B Tabulation 6
    C Tabulation
    ...
    Y Tabulation 2
    PS: Les numéro présentent le nombre de chaque nom.
    Pour cela, quand je traite un <Name>, je dois chercher à savoir s'il a une valeur différente de celui qui le précède (il est alors le premier d'une série). Si c'est le cas, je vois afficher sa valeur puis compter combien d'éléments <Name> ont la même valeur que lui dans l'ensemble du document. Si ce n'est pas le cas (il est alors 2e, 3e, 4e, etc. d'une série) je ne dois rien faire.

    Donc mon problème c'est que je n'arrive pas à transcrire le texte ci-dessous en écriture XSLT, et je pense qu'on a besoin de quelques boucles de conditions et surtout de la fontion count() pour compter le nombre total de chaque nom.

    Bien cordialement,

  8. #8
    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 : 51
    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
    Si a fait ton regroupement, alors ensuite, il te suffit de compter le nombre d'éléments de chacun des groupes avec la fonction count.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut ça ne marche pas
    Bonsoir,

    Et ben après plusieurs tentative je vois que je n'avance pas du tout. J'ai bon essayé mais je bute à chaque fois sur le nombre. Par exemple j'ai ça comme résultat final :
    A 122
    A 120
    B 119
    Be 118
    ...
    En sachant que j'ai que 3 noms qui comme par la lettre A et 6 par la lettre B lol donc je ne comprends pas comment dois-je écrire l'instruction .
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
        <xsl:output method="text"/>
        <xsl:key name="regrouper" match="Name" use="."/>
        <xsl:template match="/">
                <xsl:apply-templates select="Document/Balise/Name[generate-id(.)=generate-id(key('regrouper',.)[1])]"/>
        </xsl:template>
        <xsl:template match="Name">
                <xsl:copy-of select="."/>
                <xsl:apply-templates select="//Balise[../Name=current()]"/>
            <xsl:text>	</xsl:text>
            <xsl:value-of select="count(following::Name)"/>
        </xsl:template>
    </xsl:stylesheet>
    Merci d'avance pour vos réponse !!!

    Cordialement

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    - Tu veux regrouper des <Balise>
    Donc le match porte sur Balise match="Balise".
    De même dans le select : select="Document/Balise[condition]".
    De même dans le template : <xsl:template match="Balise">.

    - Il faut regrouper celles qui ont le même <Name>
    Donc le use porte sur Name use="Name".
    Pareil dans le select.

    - Dans ce template, tu veux compter
    -- Toutes les <Balise>
    -- qui ont le même <Name> que la Balise que tu es en train de traiter.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    J'ai essayé d'appliquer ce que tu m'as proposer mais apparament ça ne fonctionne pas. voici ce que j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:output method="text"/>
     
        <xsl:key name="regrouper" match="Balise" use="."/>
        <xsl:template match="/">
                <xsl:apply-templates select="Document/Balise[generate-id(.)=generate-id(key('regrouper',.)[1])]"/>
        </xsl:template>
        <xsl:template match="Balise">
                <xsl:copy-of select="Name"/>
                <xsl:apply-templates select="//Balise[Name=current()]"/>
            <xsl:text>	</xsl:text>
            <xsl:value-of select="count(following-sibling::Balise/Name)"/>
            <xsl:text>
    </xsl:text>
        </xsl:template>
    Et voici ce que j'ai eu comme résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Ab	122
    An	120
    Bel	119
    Ben 	118
    Ca	112
    Cia	104
    Civ	102
    Cl	98
    Ce n'est pas du tout le bon résultat puisque je suis censer d'avoir
    Normalement je dois avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Ab	2
    An	1
    Bel	1
    Ben 	6
    Ca	8
    Cia	2
    Civ	4
    Cl	1
    ...
    Donc j'attends avec impatience vos réponses.

    Merci

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    <xsl:key name="regrouper" match="Balise" use="."/>

    generate-id(key('regrouper',.)[1])
    Euh ? Allo ? Relis-moi.

    <xsl:apply-templates select="//Balise[Name=current()]"/>

    <xsl:value-of select="count(following-sibling::Balise/Name)"/>
    Il faudrait aussi que tu essaies de comprendre ce que tu fais.

    - À quoi ça sert de faire deux fois apply-templates sur des <Balise> de même nom ? Tu veux les compter une seule fois, il me semble ?

    - Ça va t'avancer à quoi de sélectionner des <Name> alors que tu recherches des <Balise> ?

    Par ailleurs, pourquoi s'acharner sur following-sibling ? Il faut chercher tous ceux qui ont le même nom. Ceux qui sont après, celui sur lequel tu es, ceux qui sont avant (bon, ça il n'y en a pas, certes. Mais on s'en fout.)

    Le nom de la <Balise> en cours, c'est current()/Name

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Rien ne va !
    Bonsoir,

    Merci pour tes explications, mais pour te dire je ne comprends pas du tout ce que tu voulais dire puisque tu demandes de changer des choses mais tu ne précises pas exactement ou dois-je faire les transformations parce que ça fait une semaine que j'essaye de résoudre ce problème mais je n'y arrive pas.
    Ci-joint les trois documents XML et XSLT ainsi le fichier résultat TXT.

    Et comme je l'avais dis je veux compter le nombre d’éléments <persName> consécutifs qui ont la même valeur.

    Désolé et merci d'avance.

    Cordialement,
    Fichiers attachés Fichiers attachés

  14. #14
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    C'est possible que ça sens difficile pour débuter sans être montré ce qu'on fait dans le champ d'action vrai.
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" omit-xml-declaration="yes" encoding="utf-8" />
    <xsl:key name="regrouper" match="Njoueur" use="persName"/>
     
    <xsl:template match="/">
        <xsl:apply-templates select="Liste/Njoueur[generate-id(.)=generate-id(key('regrouper',persName)[1])]" mode="proc" />
    </xsl:template>
     
    <xsl:template match="Njoueur" mode="proc">
        <xsl:value-of select="persName" />
        <xsl:text> Tabulation </xsl:text>
        <xsl:value-of select="count(key('regrouper',persName))" />
        <xsl:text>&#x0a;</xsl:text>
    </xsl:template>
     
    </xsl:stylesheet>

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut En fin la délivrance !
    Bonjour,

    Je vous remercie pour votre réponse qui est aussi claire et pratique. En fait, j'étais proche de la réponse, mais en même temps je me projeté sur des solutions un peu hazardeuses. Et puis, je n'ai pas du tout pensé d'utilisé le mode

    Bien cordialement,

  16. #16
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par aladin1984 Voir le message
    Je vous remercie pour votre réponse qui est aussi claire et pratique.
    Oui, mais au final tsuji a juste travaillé pour toi au lieu de te faire chercher la réponse pour que tu apprennes.
    J'aime pas trop ça, moi. Et je ne suis pas le seul, ici.

    Citation Envoyé par aladin1984 Voir le message
    Et puis, je n'ai pas du tout pensé d'utilisé le mode
    Ben, en même temps, il ne sert à rien du tout ici.

  17. #17
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Oui, mais au final tsuji a juste travaillé pour toi au lieu de te faire chercher la réponse pour que tu apprennes.
    J'aime pas trop ça, moi. Et je ne suis pas le seul, ici.
    C'est tellement clichée et pseudo-science de pédagogie à tel niveau extravagent et formulaire hors de votre comprehension.

  18. #18
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par tsuji Voir le message
    C'est tellement clichée et pseudo-science de pédagogie à tel niveau extravagent et formulaire hors de votre comprehension.
    Je ne peux pas débattre de ça avec toi tant que tu ne sauras pas écrire dans un langage compréhensible.
    Tes codes informatiques marchent en général très bien, oui. Mais que ça.

  19. #19
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Vous pouvez très bien écrire mais avec des idées fautes et bien pourries: c'est dommage.

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Bonsoir,

    Je vois que thelvin n'a pas du tout apprécié que tsuji m'explique comment ça marche! et franchement je ne comprends pas du tout sa réaction. Pour te dire thelvin j'ai bien apprécié tes indications mais elles n'étaient pas aussi claire puisque j'avais l'impression que tu me donnais des explications avec un peu d'agitation. Si j'étais un pro en XSLT je ne viendrais pas du tout sur ce forum et d'ailleurs ça fait plus d'un an que je me suis inscrits ici et je consulte que ce site. J'ai passé plusieurs jours voir plusieurs semaines pour comprendre ce langage et surtout pour résoudre les questions que j'ai posé. Voilà si on est ici c'est pour s'entraider pour apprendre et comprendre pas pour s'emmerder...

    Merci quand même et je pense que ta réflexion a eu des répercussions sur la suite de mes questions, le résultat ça fait plusieurs jours que je n'ai pas eu de réponse...
    Merci quand même !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment effectuer une transformation XSLT avec Delphi ?
    Par Raylemon dans le forum Télécharger
    Réponses: 0
    Dernier message: 10/01/2012, 16h21
  2. Réponses: 0
    Dernier message: 10/01/2012, 16h20
  3. Réponses: 0
    Dernier message: 10/01/2012, 16h19
  4. Réponses: 0
    Dernier message: 10/01/2012, 16h18
  5. [XSLT] Problème de transformation XSLT avec JAVA
    Par ploxien dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 28/09/2007, 16h47

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