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 :

[débutant]XML vers XML avec XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Points : 22
    Points
    22
    Par défaut [débutant]XML vers XML avec XSL
    J'ai un format XML arborescent en entrée et je souhaite le convertir en un format XML plat (où l'arborescence est stockée dans une balise "chemin").
    Il faut que la conversion soit automatique.
    j'ai donc décidé d'utiliser le Xsl pour transformer le fichier d'entrée. Mais je n'arrive pas à trouver comment récupérer le chemin des noeuds dans l'arborescence du fichier XML d'entrée.
    J'ai bien trouver quelques sujets dans le forum expliquant comment créer un XML "arborescent" à partir d'un XML "plat" mais pas l'inverse. Je fais donc appel à vos connaissances.
    Voici le formatage du fichier XML en entrée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <maison>
       <garage couleur="gris">
           <voiture type="coupé" couleur="noire" valeur="BMW Z3">
           </voiture>
       </garage>
           <cuisine type="ikéa" valeur = "5000€">
             <casserole type="sauteuse" manche="bois" matiere="fonte" valeur="téfal T2">
             </casserole>
           <cuisine>
    </maison>
    Voici le formatage du fichier XML en sortie:
    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
    <NOM>maison</NOM>
    <chemin>/</chemin>
    <VALEUR></VALEUR>
     
    <NOM>garage</NOM>
    <chemin>/maison</chemin>
    <VALEUR couleur="gris"></VALEUR>
     
    <NOM>voiture</NOM>
    <chemin>/maison/garage</chemin>
    <VALEUR couleur="noire" type=" coupée " >BMW Z3</VALEUR>
     
    <NOM>cuisine</NOM>
    <chemin>/maison</chemin>
    <VALEUR type="ikéa">5000€</VALEUR>
     
    <NOM>casserole</NOM>
    <chemin>/maison/cuisine</chemin>
    <VALEUR manche="bois" matiere="fonte">téfal T2</VALEUR>
    Si quelqu'un pouvait m'aider à trouver une fonction en XSL ou à en coder une permettant de récupérer le chemin d'un noeud.

    merci de votre aide

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    personne n'a de solution :
    Il doit bien exister une fonction pour récupérer le chemin d'un noeud en Xsl
    Y a t-il une âme généreuse pour m'aider sur ce forum?

  3. #3
    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,

    Citation Envoyé par tokamak
    Il doit bien exister une fonction pour récupérer le chemin d'un noeud en Xsl
    Non.

    Il faut passer par l'écriture d'une fonction (template nommé) :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<xsl:template match="/">
    		<resultat>
    			<xsl:for-each select="//*">
    				<nom><xsl:value-of select="name()"/></nom>
    				<chemin>
    					<xsl:call-template name="cheminXPath">
    						<xsl:with-param name="noeud" select="."/>
    					</xsl:call-template>
    				</chemin>
    			</xsl:for-each>
    		</resultat>
    	</xsl:template>
     
    	<xsl:template name="cheminXPath">
    		<xsl:param name="chemin" select="''"/>
    		<xsl:param name="noeud"/>
    		<xsl:choose>
    			<xsl:when test="$noeud/..">
    				<xsl:call-template name="cheminXPath">
    					<xsl:with-param name="chemin">
    						<xsl:choose>
    							<xsl:when test="$chemin = ''">
    								<xsl:value-of select="name($noeud/..)"/>
    							</xsl:when>
    							<xsl:otherwise>
    								<xsl:value-of select="concat(name($noeud/..), '/', $chemin)"/>
    							</xsl:otherwise>
    						</xsl:choose>
    					</xsl:with-param>
    					<xsl:with-param name="noeud" select="$noeud/.."/>
    				</xsl:call-template>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:value-of select="$chemin"/>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
     
    </xsl:stylesheet>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    Merci merci Grand Maitre du XML /XSL
    je m'en vais essayer ta fonction tout de suite...
    je te donnerai les résultats et la fonction Xsl que j'ai codée la semaine prochaine...
    ça pourra peut-être compléter l'exemple donné dans la FAQ pour passer d'un XML arborescent à un XML plat qui sait... la réciproque peut toujours interresser quelqu'un.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    Bon ok j'ai beau essayer de faire le reste mais je débute tout juste...et... avec toute la bonne volonté du monde et 2 docs traitants du xsl trouvées sur internet(dont celle du W3C illisible !!) j'ai du mal! Alors un peu d'aide serait la bienvenue.
    Comment récupérer les paramétres contenus dans chaque noeuds? :
    Et comment isoler la valeur du champ valeur sachant qu'il n'existe pas toujours. :
    Ca marche avec ça ?????? : :
    <valeur><xsl:value-of select ="valeur"></valeur>
    si je le met desous de </chemin> dans le code de GrandFather

    Pour les autres paramétres du noeud je sais pas du tout comment faire : . Leur nom est variable et ils doivent être incorporés à l'intérrieur de la balise valeur comme ceci :
    <valeur type="XXX" couleur="YYYY" marque="ZZZ">"WWW"</Valeur>
    Est-ce au moins possible?
    Je pense que rien n'empêche d'écrire dans les balises mais mieux vaut poser la question...
    Merci de votre aide...

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    Oki j'avais pas bien saisi la différence entre attribut et élément mais grace au sujet suivant
    ( http://www.developpez.net/forums/viewtopic.php?t=366776 ) c'est chose faite.
    Mais comment récupérer tous les attributs d'un noeud et leur valeur quand on ne les connais pas forcément ? : : :
    Dans mon fichier XML, ils changent d'un noeud à l'autre.
    il me faudrait une ligne du type:
    <VALEUR <xsl:value-of select="/@ NOMS DES ATTRIBUTS "/> ><xsl:value-of select="valeur"> </VALEUR>
    Que faut -il mettre à la place de NOM DES ATTRIBUTS pour obtenir le nom de chaque attribut et sa valeur associée??
    Merci de votre aide.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    personne ne peut m'aider ??
    Je crois pas que ma question soit trop compliquée : :
    Soyez cool ne me laisser pas souffrir comme ça

  8. #8
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Salut

    Après 5 minute de lecture je crois que j'ai enfin compris!!!

    Pour déclarer un attribut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:attribute name="toto">savaleur</xsl:attribute>
    ce qui fait dans un élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <albert><xsl:attribute name="toto">savaleur</xsl:attribute></albert>
    tu donnera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <albert toto="savaleur"/>
    pour mettre encore une valeur dans le noeud :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <albert><xsl:attribute name="toto">savaleur</xsl:attribute><xsl:value-of select="henry"></albert>
    te donnera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <albert toto="savaleur"> le value de la balise henry</albert>
    J'espère que c'est ca que tu voulais!

    ++

    Thierry

    P.S. les nouveaux tutorials XML sont arrivé va y jeté un coup d'oeil ca peut que t'aider!
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    en fait c pas exactement ce que je recherche...
    ce que je veux c'est simplement recopier le nom et la valeur de tous les attributs d'un noeud.
    Mais je ne connais pas forcement le nom de chaque attribut... a vrai dire ils différent d'un noeud à un autre.
    Comment récupérer le nom et la valeur de chaque attribut du noeud en cours ?

  10. #10
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Le contenu de la balise aussi?
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    le contenu de la balise en entrée représente la valeur du champ <NOM> de mon fichier de sortie.EXEMPLE

    fichier XML d'entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <famille type="oncle">toto</famille>
    Donne dans le fichier XML de sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <NOM>famille</NOM>
    <VALEUR type="oncle">toto</VALEUR>

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2008, 19h30
  2. Réponses: 7
    Dernier message: 04/06/2007, 15h51
  3. [XSLT]Passer du XML au CSV avec XSL
    Par tibotibotibo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 16/03/2007, 11h12
  4. [XSLT] probleme de copie de balise de XML vers HTML via XSL
    Par Clercq dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/11/2006, 13h52
  5. XML vers XML avec XSL
    Par guizz79 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2005, 09h43

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