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][XPATH] Nombre d'élèment ayant pour nom..


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut [XSLT][XPATH] Nombre d'élèment ayant pour nom..
    Bonjour,

    Soit un XML de ce style

    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
    <ROOT>
    <S>
      <ID></ID>
      <E>
        <ID></ID>
        <B>
          <ID></ID>
        </B>
      </E>
    </S>
    <S>
      <ID></ID>
      <E>
        <ID></ID>
        <B>
          <ID></ID>
        </B>
      </E>
    </S>
    ...
    </ROOT>
    J'ai un template qui me positionne sur chaque élément ID, comment connaitre le nombre total d'élément ID dans l'élèment <S>
    Je pensais à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(ancestor::*[name()='ID'])
    mais ça me retourne toujours 0.

  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,

    ton expression XPath compte le nombre d'éléments ancètres du noeud courant qui ont pour nom 'ID', alors que tu veux compter le nombre de d'éléments ID qui descendent de l'élément S ancètre de l'élément courant (si j'ai bien compris ta demande), ce qui traduit en XPath donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(ancestor::S/descendant::ID)

  3. #3
    Membre éprouvé 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
    Points : 1 247
    Points
    1 247
    Par défaut
    Je me demande plutôt si tu ne veux pas compter les ancêtres ayant un descendant immédiat ID d'où la feuille de style suivante :
    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="countid">
      <xsl:template match="/">
       <result><xsl:text>
    </xsl:text>
        <xsl:for-each select="//ID">
         <xsl:value-of select="count(ancestor::*[ID])"/><xsl:text>
    </xsl:text>
        </xsl:for-each>
       </result>
      </xsl:template>
     </xsl:stylesheet>

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut
    Merci,

    Non GrandFather a bien compris ce que je voulais, sauf que je ne connais pas le nom de mon élément <S>
    Donc en gros ce serait de compter le nombre d'éléments ID qui descendent de l'élément fils de root ancètre de l'élément courant.

    Si je fais cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(ancestor::root/Structure/descendant::ID)
    il me compte tous les ID de tous les <S> et non le ceux du <S> courant.

  5. #5
    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
    Dans ce cas ça sera plutôt cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(ancestor::*[last() - 1]/descendant::ID)
    Cela ne fonctionnera que si le moteur XPath sélectionne les éléments dans l'ordre inverse du document, ce qui ne semble pas être le cas de tous les moteurs (MSXML semble être dans ce cas, à vérifier). Il faudra dans ce cas utiliser 2 à la place de last()-1.

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut
    ça fonctionne.

    Le last() correspond à la profondeur c'est ça ?

  7. #7
    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
    Citation Envoyé par SONY30
    Le last() correspond à la profondeur c'est ça ?
    En quelque sorte. Précisément, last() est toujours utilisé dans un prédicate et est égal à la taille de la liste de noeuds sélectionnés contextuelle.

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut
    Ok. Donc la traduction litéralle de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ancestor::*[last() - 1]
    serait ?

  9. #9
    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
    En partant du noeud courant, sélectionner tous ses ancêtres, et parmi ceux-ci ne prendre que celui dont l'index dans la liste des noeuds sélectionnés (tous les ancêtres, donc) est égal à la taille de cette liste moins un, l'avant-dernier en d'autres termes.

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut
    Ok j'avais zappé que le XML était mappé "à l'envers"

    Merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/08/2007, 15h35
  2. Réponses: 1
    Dernier message: 04/04/2007, 06h12
  3. Réponses: 3
    Dernier message: 26/02/2007, 10h52
  4. [XSLT] [XPath] Nombre d'ancètres
    Par ploxien dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 30/10/2006, 15h14
  5. [XSLT][XPath] Générer un grandeur fixe pour un champs
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/09/2006, 11h31

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