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 :

Sélection d'un nœud parent selon valeur d'un de ses fils [XPATH 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut Sélection d'un nœud parent selon valeur d'un de ses fils
    Bonjour à tous,

    Je bute sur un filtre de selection XPath

    Voici la structure de mon XML :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <RootDoc>
        <Alias Nom="A1" Alias="Alias1">
            <Model>Model1</Model>
            <Model>Model5</Model>
        </Alias>
        <Alias Nom="A3" Alias="Alias1">
            <Model>Model4</Model>
            <Model>Model8</Model>
            <Model>Model9</Model>
        </Alias>
        <Alias Nom="A2" Alias="Alias2">
            <Model>Model2</Model>
        </Alias>
    </RootDoc>
    Mon filtre XPath est le suivant :
    "//Alias[translate(@Nom, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & Value & "' and translate(Model, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & ModelValue & "']/@Alias"

    Mais il ne fonctionne pas lorsqu'il y a plus de un enfant de Alias

    Exemple pour Alias A1 et A2, si je veux sélectionner sur le Model1 ça fonctionne mais sur Model5 non

    Comment traité quelque soit le model enfant ?

    Merci à vous
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  2. #2
    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
    "//Alias[translate(@Nom, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & Value & "' and translate(Model, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & ModelValue & "']/@Alias"
    C'est vrai; comme tel, ça ne ramasse que le premier Model, si existe, pour faire la comparison dans le prédicat. Par contre, on peut faire autrement comme ça:

    "//Model[translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & ModelValue & "' and parent::Alias[translate(@Nom, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & Value & "']]/parent::Alias/@Alias"

  3. #3
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Hum !!
    Ah oui on sélectionne le model direct puis on verifie que son parent à bien le nom voulu et on remonte au parent du model !
    Je ne fais pas assez de XPath pour penser dans ce sens :p

    Je reste ça demain merci à toi pour ta réponse rapide.
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  4. #4
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    J'ai fais un petit test rapide c'est nickel

    Est ce que cette simplification est bonne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//Model[translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & ModelValue & "']/parent::Alias[translate(@Nom, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & Value & "']/@Alias"
    En test ça fonctionne

    Edit : D'ailleurs j'essaye ceci (en Powershell) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//Model[translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & ModelValue & "']/..[translate(@Nom, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & Value & "']/@Alias"
    Et je ne comprends pas pourquoi ça ne fonctionne pas
    Alors que ça passe sur des tester Online...
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  5. #5
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Et du coup également ceci me donne ce que je souhaite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//Alias[translate(@Nom, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & Value & "' and Model[translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & ModelValue & "']]/@Alias"
    Qu'en pensez vous ?
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  6. #6
    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
    Si on remplace /..[etc] par /parent::Alias[etc], ce serait équivalent, sinon, il faut contrôler le nom de .. comme ceci /..[name()='Alias'][etc] si on insiste d'utiliser la notion de double-point.

  7. #7
    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
    Je réfère à la réponse #4 ... (Je suis en mobile, taper est difficile.)

  8. #8
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Je confirme, la réponse que j'ai indiqué en #5 fonctionne...
    Pourtant pas grande différence avec ce que j'avais initialement fait.

    Le seule changement est le translate non pas sur Model mais sur son texte.
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  9. #9
    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
    Citation Envoyé par cerede2000
    Je confirme, la réponse que j'ai indiqué en #5 fonctionne...
    Pourtant pas grande différence avec ce que j'avais initialement fait.
    Je crois vous jouez très bien là: il devrait marcher aussi. La différence en tant que fil de raisonnement est que #5 veut dire tester l'existence de tel Model, donc, le code va continuer chercher tel Model; tandis que le #1 veut dire ramasser le Model, donc la première instance réussi est fait, et comparer le contenu textuel... Mais la façon de raisonner dépend aussi la version de xslt parce que ça a changé 2.0 vs 1.0 je dirais substantivement. Bravo!

    ps Je vais éditer un peu mes deux dernières posts sur les typos...

  10. #10
    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
    La seule chose reste à faire attention est que quand on veut comparer le contenu textuel (vis à vis par exemple comparer le nom d'un noeud etc) il vaut toujours mieux de ramener le texte à un format plus ou moins standard ce qui est fait facilement avec normalize-space(). En pratique, ça veut dire remplacer le point(.) par normalize-space(), et @Nom par normalize-space(@Nom). Voilà !

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

Discussions similaires

  1. Supprimer ou selectionner objet d'un json selon valeur d'un de ses champs
    Par zut_php dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 29/03/2017, 08h00
  2. xml: copier un node parent selon valeur d'un enfant
    Par morinxav1 dans le forum VBScript
    Réponses: 0
    Dernier message: 30/01/2014, 14h55
  3. div parent au premier plan par rapport à ses fils?
    Par hamidap dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 27/03/2009, 16h05
  4. Ajout n lignes selon valeur...
    Par nicburger dans le forum Access
    Réponses: 1
    Dernier message: 26/10/2005, 19h49
  5. affichage selon valeur entiere ou decimale
    Par Ankya dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 04/05/2005, 10h36

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