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] Récupérer une valeur pour un id donné


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 26
    Points
    26
    Par défaut [XSLT] Récupérer une valeur pour un id donné
    Bonjour,

    Je souhaite faire une transformation d'un fichier XML vers un autre fichier XML grâce à une transformation XSL.

    Dans mon fichier XML d'entrée, j'ai quelque chose du type :
    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
    <body>
    <element1>
    <sous-element1>
    <attribut1>
    ...
    </attribut1>
    <attribut2 idRef="idAttRef2"/>
    </sous-element1>
    <sous-element2>
    ...
    </sous-element2>
    </element1>
    <_REFERENCED>
    <attributRef1 id="idAttRef1">
    <info1>valeur1</info1>
    ...
    </attributRef1>
    <attributRef1 id="idAttRef2">
    <info1>valeur2</info1>
    ...
    </attributRef1>
    ...
    </_REFERENCED>
    Je souhaite récupérer la valeur de l'élément "info1" de l'attribut référencé dans mon élément "attribut2".
    J'ai définie une clé sur l'idRef, mais quand j'essaie de récupérer la valeur il me met la première valeur qu'il rencontre et non pas celle associée à l'id.
    J'obtiens "valeur1" tout le temps.

    Voici ce que j'ai codé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:key name="idRefAtt" match="body/element1/sous-element1/attribut2" use="@idRef"/>
     
    <xsl:value-of select="key('idRefAtt',body/_REFERENCED/attributRef1/@id)/../../_REFERENCED/attributRef1/info1"/>
    Si quelqu'un a une idée, parce là vraiment je bloque.
    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,

    je ne vois pas trop en quoi les éléments <attribut2> interviennent... Hormis cela, ce sont les éléments <attributRef1> qu'il faut indexer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="idRefAtt" match="attributRef1" use="@id" />
    Pour retrouver une des valeurs indexées, à partir d'un ID stocké dans la variable $idref :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="key('idRefAtt', $idref)/info1" />

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    Merci mais malheureusement dans mon cas la solution proposée ne fonctionne pas. Avec le symbole "$" j'ai une erreur lorsque je fais un test.

    En triturant dans tous les sens la fonction key, j'ai trouvé une solution qui semble fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:key name="idRefAtt" match="body/element1/sous-element1/attribut2" use="@idRef"/>
     
    <xsl:value-of select="body/_REFERENCED/attributRef1[key('idRefAtt',@id)]/info1/text()"/>

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 26
    Points
    26
    Par défaut suite un peu plus complexe
    Bonjour,

    J'arrive maintenant à récupérer un élément pour un id donné mais lorsque j'ai deux éléments je n'arrive pas à récupérer les valeurs des deux.

    Voilà ce que j'ai dans mon fichier XML :
    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
    <body>
    <ajoutClient>
    <client>
    <civilite>
    ...
    </civilite>
    <sonAdresse idRef="idAttRef1"/>
    <sonAdresse idRef="idAttRef2"/>
    </client>
    <produit>
    ...
    </produit>
    </ajoutClient>
    <_REFERENCED>
    <adresse id="idAttRef1">
    <info1>valeur1</info1>
    ...
    </adresse>
    <adresse id="idAttRef2">
    <info1>valeur2</info1>
    ...
    </adresse>
    ...
    </_REFERENCED>

    Je souhaite afficher les deux adresses.
    J'ai défini dans le fichier XSL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:key name="idRefAtt" match="body/ajoutClient/client/sonAdresse" use="@idRef"/>
    Comment puis-je faire pour afficher les deux adresses?
    Dans mon fichier XSL j'utilise également xsl:template et xsl:call-template.

  5. #5
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Si tu disais exactement ce que tu veux faire...parce que ta clé n'ayant aucun rapport avec ta question à première vue cela n'aide pas

    J'aurais compris une clé sur adresse si ce sont les données que tu veux recupere, mais une clé sur sonadresse alors que le point de depart logique serait client, la va falloir l'expliquer

    PS:Merci d'utiliser les balises codes à l'avenir

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Voici un peu plus de précisions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <xsl:template name="montemplategeneral">
    <xsl:for-each select="body/ajoutClient/client/sonAdresse">
    <adresse>
    <xsl:call-template name="montemplate"/>
    <adresse>
    ...
    </xsl:for-each>
    </xsl:template>
     
    ...
    <xsl:template name="montemplate">
    <xsl:value-of select="body/_REFERENCED/adresse[key('idRefAtt',@id)]/info1/text()"/>
    </xsl:template>
    Malheureusement cela ne me retourne que le premier élément.

  7. #7
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    sans clés, parce que cela ne donne pas l'impression que tu es vraiment compris leur mecanisme et intérêt .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	<xsl:template name="montemplategeneral">
    		<xsl:for-each select="body/ajoutClient/client/sonAdresse">
    			<adresse>
    					<xsl:for-each select="//_REFERENCED/adresse[@id=current()/@idRef]">
    					.......
    				</xsl:for-each>
    			</adresse>
    		</xsl:for-each>
    	</xsl:template>

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Merci,
    Je vais essayer de mettre en œuvre ce que tu m'as donné. Mais pourrais-tu préciser en quoi tu as l'impression que je n'ai pas compris le mécanisme et intérêt des clés?

  9. #9
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    1) parce que ces clés sont mal conçues à l'origine dans les deux cas
    2) parce qu'elles sont de toutes façon loin d'être indispensable dans les 2 cas.
    Un simple xpath suffit, sauf si on travaille sur des fichiers un minimum volumineux (depasse les 10 megas) ou le gain de temps occasionés devient non négligeable, mais cela n'est pas present dans ton argumentaire.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2012, 03h04
  2. Réponses: 3
    Dernier message: 27/10/2008, 12h05
  3. Récupérer une valeur pour un lien
    Par totor54300 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/12/2007, 13h51
  4. récupérer des valeurs pour une semaine donnée
    Par duck54 dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/05/2006, 01h13
  5. Réponses: 2
    Dernier message: 17/06/2005, 13h38

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