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 :

Afficher la valeur d'un attribut de l'ancêtre d'un noeud suivant si celui-ci possède un attribut identique


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Afficher la valeur d'un attribut de l'ancêtre d'un noeud suivant si celui-ci possède un attribut identique
    Bonjour,

    J'aimerais savoir comment afficher la valeur d'un attribut de l'ancêtre d'un noeud suivant ou précédent, si celui-ci possède une valeur identique d'un autre attribut.

    Pour exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <NIV1 Name1="AA"  Name2="BB" >
      <NIV2 Name3="CC" Name4="DD"/>
    </NIV1>
    <NIV1 Name1="EE"  Name2="FF" >
      <NIV2 Name3="GG" Name4="HH"/>
    </NIV1>
    <NIV1 Name1="II"  Name2="JJ" >
      <NIV2 Name3="GG" Name4="KK"/>
    </NIV1>
    <NIV1 Name1="LL"  Name2="MM" >
      <NIV2 Name3="CC" Name4="NN"/>
    </NIV1>
    Dans cette exemple il faudrait que je récupère via XSLT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <NIV Att1="CC" Att2="BB" Att3="MM"/>
    <NIV Att1="GG" Att2="FF" Att3="JJ"/>
    <NIV Att1="GG" Att2="JJ" Att3="FF"/>
    <NIV Att1="CC" Att2="MM" Att3="BB"/>
    du coup j'ai commencé comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:template match="//NIV2">
      <xsl:element name="NIV">
        <xsl:attribute name="Att1">
          <xsl:value-of select="@Name3"/>
        </xsl:attribute>
        <xsl:attribute name="Att2">
          <xsl:value-of select="ancestor::NIV1[1]/@Name2"/>
        </xsl:attribute>
        <xsl:attribute name="Att3">
          <xsl:value-of select="????????????"/>
        </xsl:attribute>
      </xsl:element>
    </xsl:template>
    Mais pour le Att3 je ne trouve pas malgrès avoir essayé différentes combinaisons "following" "following-sibling"........

    Merci d'avance pour votre aide et j'espère avoir été assez clair.
    Cordialement Xaros

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Commençons par remarquer que ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:template match="//NIV2">
      <xsl:element name="NIV">
        <xsl:attribute name="Att1">
          <xsl:value-of select="@Name3"/>
        </xsl:attribute>
        <xsl:attribute name="Att2">
          <xsl:value-of select="ancestor::NIV1[1]/@Name2"/>
        </xsl:attribute>
        <xsl:attribute name="Att3">
          <xsl:value-of select="????????????"/>
        </xsl:attribute>
      </xsl:element>
    </xsl:template>
    serait nettement plus simple comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="//NIV1">
      <NIV
        Att1="{NIV2/@Name3}"
        Att2="{@Name2}"
        Att3="{?????????????}"
        />
    </xsl:template>
    • Il est bien plus clair de sélectionner l'élément englobant et aller chercher les informations dans ses fils, que de descendre jusqu'aux fils puis remonter au parent ensuite. Oublions un peu le yo-yo.
    • Tu es en train de faire du XML, donc peut-être devrais-tu écrire les choses directement en XML. Tous ces <xsl:element> et <xsl:attribute> ne te facilitent pas la tâche.


    ... Ce qui ne nous dit pas comment faire le troisième.

    en supposant que tu ne cherches que les suivants, la syntaxe serait celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Att3="{following-sibling::*[NIV2/@Name3 = current()/NIV2/@Name3]/@Name2}"
    • On prend les éléments suivants
    • On ne garde que ceux qui ont un Name3 égal à celui de l'élément en cours
    • Parmi ce qui reste, on affiche le Name2


    Oui, mais on veut pas juste les suivants, on veut les suivants ou les précédents.
    Donc en gros on veut juste exclure l'élément en cours en fait. C'est pas les moyens qui manquent, mais j'aime celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variables name="siblings" select="preceding-sibling::* | following-sibling::*">
    puis réutiliser le même prédicat sur la variable $siblings.

    Une remarque quand même : si le document à traiter est très gros, tout cela n'est pas un algorithme bien efficace.
    Pour gagner en rapidité il faudrait repenser ça pour mettre un index sur les NIV1/NIV2/@Name3 afin de retrouver plus facilement ceux qui correspondent.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse Thelvin et merci pour la simplification d'écriture,

    Par contre il faut absolument que je reste sur le noeud NIV2, car dans la réalité c'est le noeud a partir duquel je viens chercher le plus d'information. Comment adapter tes codes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Att3="{following-sibling::*[NIV2/@Name3 = current()/NIV2/@Name3]/@Name2}"
    et/ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:variables name="siblings" select="preceding-sibling::* | following-sibling::*">
    afin qu'ils aillent chercher l'info du NIV1?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Xaros Voir le message
    Par contre il faut absolument que je reste sur le noeud NIV2, car dans la réalité c'est le noeud a partir duquel je viens chercher le plus d'information.
    C'est pas important la quantité d'information. Je te dis d'arrêter le yo-yo, c'est tout.

    Commence déjà par apprendre à faire comme ça et réussir ce que tu essayais d'obtenir. Une fois que tu auras appris ce dont tu as besoin, tu pourras toujours revenir à ton idée de te concentrer sur NIV2 et adapter le code pour. Tu n'auras pas besoin d'aide pour le faire. Et en principe, tu te rendras compte après avoir essayé que c'était débile. Mais bref, plus tard. Fais déjà comme il faut faire, apprends, progresse, et ensuite quand tu auras besoin de personne tu feras bien ce que tu veux.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Afficher une valeur différente de l'attribut "value" pour un bouton de type submit
    Par verbose dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 07/11/2019, 10h03
  2. [SimpleXML] Afficher un attribut, afficher sa valeur
    Par zuger dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 25/01/2013, 09h40
  3. Afficher la valeur de l'attribut d'un objet
    Par SQUAL dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/12/2011, 09h59
  4. Réponses: 3
    Dernier message: 28/01/2004, 14h55
  5. Afficher une valeur du context
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 13
    Dernier message: 28/04/2003, 13h49

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