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

XML/XSL et SOAP Discussion :

[XSLT 1.0] Interprétation d'un XPATH contenu dans un Attribut


Sujet :

XML/XSL et SOAP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [XSLT 1.0] Interprétation d'un XPATH contenu dans un Attribut
    Bonjour à tous,

    Je débute en XSLT et je me retrouve confronté à une problématique XSLT sur laquelle je n'ai pas réussi à trouver une solution (après une journée de recherche sur le web).

    Mon XML de départ correspond à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <FrefProjet>
         <frefEchange>
              <name>Test1</name>
         </frefEchange>
         <frefEchange reference="../frefEchange"/>
    </FrefProjet>
    Par le biais d'un traitement XSLT, je dois créer un élément "Echange" par "frefEchange" avec son nom, y compris celui comportant une référence. Du coup, je dois créer un XML qui ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <Projet>
         <Echange>
              <nom>Test1</nom>
         </Echange>
         <Echange>
              <nom>Test1</nom>
         </Echange>
    </Projet>
    Après quelques recherches sur le web, j'arrive à un code qui ressemble à :
    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
    25
    26
    27
    28
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">
      <xsl:output method="xml" />
     
    	<xsl:template match="/">
    		<Projet>
    			<xsl:apply-templates />
    		</Projet>
    	</xsl:template>	
     
    	<xsl:template match="FrefProjet">
    		<xsl:for-each select="frefEchange">
    			<Echange>
    				<xsl:choose>
    					<xsl:when test="not(@reference)">
    						<nom><xsl:value-of select="name"/></nom>
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:variable name="exchangePath" select="@reference" /> 
    						<nom><xsl:value-of select="$exchangePath/name"/></nom>
    					</xsl:otherwise>
    				</xsl:choose>
    			</Echange>
    		</xsl:for-each>
    	</xsl:template>
     
    </xsl:stylesheet>
    Comme vous l'aurez compris, le résultat n'est pas vraiment bon. Je créé bien un élément "Echange" par élément "frefEchange" dans mon XML source, mais je n'arrive pas à récupérer l'élément "name" de ce dernier.

    Je n'arrive pas à faire comprendre le fait que je souhaite accéder au PATH contenu dans ma variable "exchangePath".

    Pourriez-vous me venir en aide ?

    Merci d'avance,

    Jérémy

  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
    Citation Envoyé par jmistero Voir le message
    Je n'arrive pas à faire comprendre le fait que je souhaite accéder au PATH contenu dans ma variable "exchangePath".
    Cela s'appelle du XPath dynamique, et en fait, c'est juste pas prévu pour. Dans le monde XML on ferait plutôt comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <FrefProjet>
      <frefEchange id="test1">
        <name>Test1</name>
      </frefEchange>
      <frefEchange reference="test1"/>
    </FrefProjet>
    Vu que la référence se trouve dans le même document que ce qu'elle référence, l'emploi de XPath n'est pas très malin, il vaut mieux identifier directement ce qui doit être référencé, avec de la sémantique ad hoc.

    Mais bon en théorie il existe des moyens.
    - en EXSLT la fonction dyn:evaluate(), ou
    - en XSLT 2.1, <xsl:evaluate>.
    ... À condition que ton moteur XSLT gère l'un ou l'autre, ce qui est peu probable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse rapide thelvin.

    Je dois pouvoir faire modifier le XML d'origine par l'application qui me l'envoie pour correspondre à ta préconisation.

    Comment dois-je procéder pour sélectionner l'élément par id ?

    Je pensais faire comme 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:for-each select="frefEchange">
    	<Echange>
    		<xsl:choose>
    			<xsl:when test="not(@reference)">
    				<nom><xsl:value-of select="name"/></nom>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:variable name="exchangePath" select="@reference" /> 
    				<nom><xsl:value-of select="//FrefProjet/frefEchange[id=$exchangePath]/name"/></nom>
    			</xsl:otherwise>
    		</xsl:choose>
    	</Echange>
    </xsl:for-each>
    Mais cela ne fonctionne pas. Ma condition pose t'elle problème ?

    Merci d'avance,

    Jérémy

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    J'ai trouvé une solution en utilisant une key. Cela donne :

    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:key name="echanges" match="frefEchange" use="@id"/>
    <xsl:for-each select="frefEchange">
    	<Echange>
    		<xsl:choose>
    			<xsl:when test="not(@reference)">
    				<nom><xsl:value-of select="name"/></nom>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:variable name="exchangePath" select="key('echanges',@reference)" /> 
    				<nom><xsl:value-of select="$exchangePath/name"/></nom>
    			</xsl:otherwise>
    		</xsl:choose>
    	</Echange>
    </xsl:for-each>
    Merci beaucoup pour ton aide thelvin. Je vais mettre le statut à [Résolu]

  5. #5
    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 jmistero Voir le message
    Mais cela ne fonctionne pas. Ma condition pose t'elle problème ?
    T'avais oublié le @.
    Mais de toute façon, l'approche à coups de key() est préférable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Cracher de l'html contenu dans un attribut
    Par tiboudchou dans le forum Struts 2
    Réponses: 1
    Dernier message: 15/11/2008, 21h58
  2. Réponses: 15
    Dernier message: 04/10/2007, 10h37
  3. Réponses: 4
    Dernier message: 18/02/2007, 20h28
  4. Réponses: 4
    Dernier message: 20/07/2006, 10h35
  5. [XPath] contenu d'une balise vide ?
    Par mimi31110 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 16/06/2006, 14h50

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