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 :

Extraction balise en fonction d'une autre de même niveau [XPATH 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut Extraction balise en fonction d'une autre de même niveau
    Bonjour,
    cas simple mais dont je n'arrive pas à trouver l'issue :

    fichier :
    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
     
    <PID.12.1>2 RUE DU REFUGE</PID.12.1>
    <PID.12.2/>
    <PID.12.3>PARIS</PID.12.3>
    <PID.12.4/>
    <PID.12.5>75005</PID.12.5>
    <PID.12.6>FRA</PID.12.6>
    <PID.12.7>H</PID.12.7>
    <PID.12.1/>
    <PID.12.2/>
    <PID.12.3>MARSEILLE</PID.12.3>
    <PID.12.4/>
    <PID.12.5>13001</PID.12.5>
    <PID.12.6>FRA</PID.12.6>
    <PID.12.7>BDL</PID.12.7>
    requête XPATH pour obtenir la valeur de PID.12.5 si PID.12.7 = 'F' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //PID.12.5[../PID.12.7/text()='H']/text()
    Merci de votre aide

  2. #2
    Modérateur

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

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

    en même temps c'est complètement pourri comme format XML, il n'y a donc aucune raison que le problème soit "simple."

    Enfin, tu peux t'en sortir avec following::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //machin[following::truc[1] = 'Bidule']
    Les text() ne sont pas nécessaires.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Pourri ou pas, c'est un fichier xmlisé par un EAI.

    En tout cas merci pour tout aide.
    ça marche

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 905
    Points : 6 695
    Points
    6 695
    Par défaut
    Attention à bien préciser l'item concerné ([1]) dans la condition pour être sûr de cibler uniquement l'élément PID.12.7 suivant (et pas celui à l'autre bout du fichier).

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Effectivement, merci.

    Vu que l'erreur est facile à faire et pas à voir, je modifie mon code pour la corriger.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Bonjour,
    Autre question toujours sur ce même fichier : via XSLT, je voudrais modifier la valeur de PID.12.5 si PID.12.7='H'
    J'ai essayé ce code en passant en paramètre nom_Element =PID.12.5 et Valeur_Cible la valeur que je veux placer, mais ma condition est complètement ignorée : les deux balises PID.12.5 sont modifiées avec la valeur de Valeur_Cible passée en paramètre

    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="iso-8859-1"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0"/>
    	<xsl:param name="nomElement">Nom_Element</xsl:param>
    	<xsl:param name="valCible">Valeur Cible</xsl:param>
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:choose>
    				<xsl:when test="name()=$nomElement">
    				<xsl:if test="//PID.12.7='H'"><xsl:value-of select="$valCible"></xsl:value-of></xsl:if></xsl:when>
    				<xsl:otherwise>
    					<xsl:apply-templates select="@* | node()"/>
    				</xsl:otherwise>	
    			</xsl:choose>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>

  7. #7
    Modérateur

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

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

    c'est parce que ton test commence par //
    Ça signifie qu'il cherche un élément qui réponde à la condition, n'importe où dans le document. Il ne s'intéresse pas spécialement de savoir s'ils sont près ou loin de l'élément <PID.12.5> en cours.

    À nouveau, following::bidule[1] te permettra de localiser celui qui se situe juste après, au lieu de n'importe lequel.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Merci pour ta réponse mais je ne m'en sors pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="//PID.12.5[following::PID.12.7[1]/text()='H']"><xsl:value-of select="$valCible"></xsl:value-of></xsl:if></xsl:when>
    Modifie malgré tout toutes les occurences de PID.12.5
    J'ai essayé un peu tout, soit il ne recopie plus du tout le champ, soit il modifie les deux.

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Euh....

    - J'ai dit que c'était à cause du // au début. Ça sert à séléctionner des éléments n'importe où et toi, tu ne veux pas sélectionner des éléments n'importe où. Donc il faut l'enlever.
    - Ton test vérifie quelque chose à propos de l'élément <PID.12.7>. Il doit donc sélectionner un élément <PID.12.7> et pas un élément <PID.12.5>

    Comme je l'ai dit, ça doit commencer par following::element-a-verifier[1]

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    OK, Dsl

    effectivement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="following::PID.12.7[1]='H'"><xsl:value-of select="$valCible"></xsl:value-of></xsl:if>
    par contre, si je veux rentre paramétrable cette condition, elle est totalement ignorée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	<xsl:if test="$conditionTrue"><xsl:value-of select="$valCible"></xsl:value-of></xsl:if>
    avec conditionTrue="following:ID.12.7[1]='H'"

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Normal, XSLT ne gère pas les expressions dynamiques. Ta variable ne contient qu'une simple string, pas une condition.
    Si tu as un peu de chance, le moteur XSLT que tu utilises gère peut-être EXSLT et permet peut-être d'utiliser dyn:evaluate. Mais ça ne fait pas partie de XSLT standard.

    Ce n'est pas ça, que tu cherchais à paramétrer, dans tes exemples précédents. Tu as changé d'avis ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Si, c'est bien ce que je voulais faire mais je voulais rendre cette feuille de style réutilisable pour remplacer n'importe quel champ sous condition.

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Bah tu peux mettre un nom de champ dans une variable, une valeur que quelque chose doit prendre dans une autre variable. Ça ce sont des strings, donc ça marche.
    Mais tu ne peux pas mettre une expression XPath.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    OK, je vais voir si je peux faire différemment.

    En tout cas merci pour ton aide précieuse

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

Discussions similaires

  1. Extraction d'une chaine en fonction d'une autre
    Par Erlen dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 19/04/2012, 15h26
  2. [MySQL] Liste déroulante en fonction d'une autre sur même page
    Par michel81 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/11/2008, 11h41
  3. Probleme d'apel de fonction dans une autre classe
    Par freecell31 dans le forum MFC
    Réponses: 24
    Dernier message: 13/05/2006, 11h34
  4. Modifier la valeur d'un champ en fonction d'une autre...
    Par venividivici dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 25/08/2005, 14h28
  5. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29

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