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][xalan]Demande d'aide pour un comptage


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut [xsl][xalan]Demande d'aide pour un comptage
    Bonjour,

    J'ai un peu de mal à maitriser XPath, j'aimerais pouvoir me faire un peu aider... Mon problème 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
    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
    <Liste1>
       <B1>
       <Liste2>
          <2>
          <Liste3>
             <3>
             <Liste4>
                <4></4>
                <4></4>
             </Liste4>
             </3>
             <3>
             <Liste4>
                <SAUT></SAUT>
                <4></4>
                <4></4>
             </Liste4>
             </3>
          </Liste3>
          </2>
          <2>
          <Liste3>
             <3>
             <SAUT></SAUT>
             <Liste4>
                <4></4>
                <4></4>
             </Liste4>
             </3>
             <3>
             <Liste4>
                <SAUT></SAUT>
                <4></4>
                <4></4>
             </Liste4>
             </3>
          </Liste3>
          </2>
       </Liste2>
       </B1>
       <B1>
       <Liste2>
          <2>
          <SAUT></SAUT>
          <Liste3>
             <3>
             <Liste4>
                <4></4>
                <4></4>
             </Liste4>
             </3>
             <3>
             <Liste4>
                <SAUT></SAUT>
                <4></4>
                <4></4>
             </Liste4>
             </3>
          </Liste3>
          </2>
          <2>
          <Liste3>
             <3>
             <Liste4>
                <SAUT></SAUT>
                <4></4>
                <4></4>
             </Liste4>
             </3>
             <3>
             <Liste4>
                <SAUT></SAUT>
                <4></4>
                <4></4>
             </Liste4>
             </3>
          </Liste3>
          </2>
       </Liste2>
       </B1>
    </Liste1>

    ==> J'aimerais à partir de cette arborescence faire un comptage des balises "SAUT" précédant l'endroit où je fais le comptage, mais restant à l'intérieur des balises B1. Cet endroit peut être une balise <2>, <3> ou <4>.

    Actuellement, j'utilise le comptage suivant :
    count(preceding::SAUT[ancestor::B1[descendant::node()=current()]])

    Malheusement, je n'arrive pas à me limiter aux balises B1.
    Pour l'exemple précédent, à partir de la balise <4></4>, j'aimerais obtenir 4 et non 7.

    Je ne sais pas si je m'explique assez bien.
    N'hésitez pas à ne demander précision.

    Merci d'avance.

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

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

    le ancestor::B1[descendant::node()=current()] ne fonctionne pas car XPath traite le test d'égalité en comparant les contenus des deux balises (en les passant par la fonction string()), ce qui est bien différent d'un test d'identité.

    En XPath, les tests d'identités se font le plus fréquemment en comparant les id des noeuds ; un id unique peut être généré par le processeur XSLT pour chaque noeud du XML avec la fonction generate-id() qui renvoie un id pour le noeud passé en paramètre. Dans ton cas, on ne doit compter les noeuds <SAUT> précédant le noeud courant uniquement que s'ils ont le même ancêtre B1. Ca donne en langage XPath :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(preceding::SAUT[generate-id(current()/ancestor::B1[1]) = generate-id(ancestor::B1[1])])
    Une précision : le XML que tu donnes en exemple n'est pas valide. Les noms des éléments ne doivent pas commencer par un chiffre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Nickel!

    Merci beaucoup.

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

Discussions similaires

  1. [VBA] Excell : demande d'aide pour une macro
    Par Fealendril dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/01/2006, 17h28
  2. Demande d'aide pour un exercice
    Par IDE dans le forum C
    Réponses: 3
    Dernier message: 29/10/2005, 16h09
  3. Demande d'aide pour query difficile
    Par ericjean514 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/02/2005, 19h52
  4. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 03h40
  5. [TPW][cours]Demande d'aide pour finir un programme
    Par jf dans le forum Turbo Pascal
    Réponses: 21
    Dernier message: 16/06/2003, 19h10

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