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] Changer les noms de balise lors de la fusion


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier Avatar de toxine
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 78
    Points
    78
    Par défaut [XSLT] Changer les noms de balise lors de la fusion
    bonjour,

    J'ai un fichier XML que j'aimerais transformer dans un autre XML
    Chaque noeud "<MENU>" est à transformer en noeud dont le nom dépend de l'attribut "tid" de "<MENU>".

    le premier fichier XML à tranformer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <MENUS>
    	<MENU id="704" nom="Offre" page="3398_offre" tid="2" texte="rubrique coutier">
    		<MENU id="719" nom="Locataire" page="3337_Loc" tid="2.1" texte="" />
    		<MENU id="705" nom="Notre Expertise" page="3376_Expert" tid="2.2" texte="type de texte de Courtage_0">
    			<MENU id="782" nom="Exemple Expertise" page="" tid="2.2.0" texte="" />
    		</MENU>	
    	</MENU>
    </MENUS>
    fichier résultant (normalement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-16"?>
    <XML>
    <root>
    	<a2 html="Offre" img="Folder.gif"  exp="True"
    		<a2_1 html="Locataire" img="Folder.gif"  exp="True" />
    		<a2_2 html="Notre Expertise" img="Folder.gif"  exp="True" 
    			<a2_2_0 html="Exemple Expertise" img="Folder.gif"  exp="True" />
    		</a2_2>
    	</a2>
    	</root>
    </XML>
    voici mon code XSLT :
    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
    <?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" indent="yes" />
    	<!--  NOEUD RACINE -->
    	<xsl:template match="MENUS">
    		<XML>
    			<root>
    				<xsl:apply-templates select="MENU" />
    			</root>
    		</XML>
    	</xsl:template>
    	<!-- MENU -->
    	<xsl:template match="MENU">
    			<xsl:param name="nomborne" select='concat("a",translate(@tid,".","_"))' />
    			<xsl:text disable-output-escaping="yes">&lt;</xsl:text>
    				<xsl:value-of select="$nomborne" />
    			<xsl:text disable-output-escaping="yes">&gt;</xsl:text>
     
    			<xsl:attribute name="html"><xsl:value-of select="@nom" /></xsl:attribute>
    			<xsl:attribute name="img">Folder.gif</xsl:attribute>
    			<xsl:attribute name="exp">True</xsl:attribute>
     
    			<xsl:if test="MENU">
    				<xsl:apply-templates select="MENU" />
    			</xsl:if>
     
    			<xsl:text disable-output-escaping="yes">&lt;/</xsl:text>
    			<xsl:value-of select="$nomborne" />
    			<xsl:text disable-output-escaping="yes">&gt;</xsl:text>
    	</xsl:template>
    </xsl:stylesheet>
    Le malin me ressort les bons noms de noeuds (<a2 etc...) mais sans les attributs. on dirait qu'il ne prend pas mes noms de noeuds que je génère (suivant l'attribut tid du premier XML) comme étant des noeuds.

    Comment est ce possible ?


    EDIT : Voila mon fichier résultant avec le code précédent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-16"?>
    <XML>
    <root><a2><a2_1></a2_1><a2_2><a2_2_0></a2_2_0></a2_2></a2></root>
    </XML>

  2. #2
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    dans ton translate tu as inversé les " ' " et les " " ".
    sinon j aurais ecrit ceci pour le template MENU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="//MENU">
    	<xsl:variable name="name" select="concat('a', translate(@tid,'.','_'))"/>
    	<xsl:element name="{@name}">
    		<xsl:attribute name="html" select="@nom"/>
    		<xsl:attribute name="img">Forlder.gif</xsl:attribute>
    		<xsl:attribute name="exp">True</xsl:attribute>
    	</xsl:element>
    </xsl:template>

  3. #3
    Membre régulier Avatar de toxine
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 78
    Points
    78
    Par défaut
    j'essayerais ta solutions un peu plus tard :
    Pour l'instant j'ai réussi a m'en sortir en écrivant de façon non typé mon fichier XML résultant de la façon suivante :

    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
    <?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" indent="yes" />
    	<!--  NOEUD RACINE -->
    	<xsl:template match="MENUS">
    		<XML>
    			<root>
    				<xsl:apply-templates select="MENU" />
    			</root>
    		</XML>
    	</xsl:template>
    	<!-- MENU -->
    	<xsl:template match="MENU">
    			<xsl:variable name="nomborne" select='concat("a",translate(@tid,".","_"))' />
    			<xsl:text disable-output-escaping="yes">&lt;</xsl:text>
    				<xsl:value-of select="$nomborne" />
     
    			<xsl:text disable-output-escaping="yes"> html="</xsl:text>
    				<xsl:value-of select="@nom" />
    			<xsl:text disable-output-escaping="yes">"</xsl:text>
    			<xsl:text disable-output-escaping="yes"> img="Folder.gif"</xsl:text>
    			<xsl:text disable-output-escaping="yes"> exp="True"</xsl:text>
    			<xsl:text disable-output-escaping="yes"> url=""&gt;</xsl:text>
     
    			<xsl:if test="MENU">
    				<xsl:apply-templates select="MENU" />
    			</xsl:if>
     
    		<xsl:text disable-output-escaping="yes">&lt;/</xsl:text>
    			<xsl:value-of select="$nomborne" />
    		<xsl:text disable-output-escaping="yes">&gt;</xsl:text>
    	</xsl:template>	
    </xsl:stylesheet>
    et ça marche

    (il est vrai que c'est pas beau :/ )

  4. #4
    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
    Citation Envoyé par tiscars
    dans ton translate tu as inversé les " ' " et les " " ".
    sinon j aurais ecrit ceci pour le template MENU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="//MENU">
    	<xsl:variable name="name" select="concat('a', translate(@tid,'.','_'))"/>
    	<xsl:element name="{@name}">
    		<xsl:attribute name="html" select="@nom"/>
    		<xsl:attribute name="img">Forlder.gif</xsl:attribute>
    		<xsl:attribute name="exp">True</xsl:attribute>
    	</xsl:element>
    </xsl:template>
    C'est ce que j'aurais fait également, mais il y a quelques erreurs dans ton code. Voici une version corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="MENU">
    	<xsl:variable name="name" select="concat('a', translate(@tid,'.','_'))"/>
    	<xsl:element name="{$name}">
    		<xsl:attribute name="html"><xsl:value-of select="@nom"/></xsl:attribute>
    		<xsl:attribute name="img">Forlder.gif</xsl:attribute>
    		<xsl:attribute name="exp">True</xsl:attribute>
    	</xsl:element>
    </xsl:template>

  5. #5
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    Bonjour grand father
    quelle est la difference entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:attribute name="html" select="@nom"/>
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:attribute name="html"><xsl:value-of select="@nom"/></xsl:attribute>
    car personnelemnt je ne fais pas de difference

  6. #6
    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
    Citation Envoyé par tiscars
    quelle est la difference entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:attribute name="html" select="@nom"/>
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:attribute name="html"><xsl:value-of select="@nom"/></xsl:attribute>
    car personnelemnt je ne fais pas de difference
    Il n'existe pas d'attribut select pour xsl:attribute, la valeur de l'attribut doit être spécifiée entre les balises ouvrante et fermante.

  7. #7
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    bizarre je viens d essayer d ecire cela avec xmlspy et l assistant me propose bien select apres l attribut name...

  8. #8
    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
    Citation Envoyé par tiscars
    bizarre je viens d essayer d ecire cela avec xmlspy et l assistant me propose bien select apres l attribut name...
    C'est parce que tu es en XSLT 2.0. Dans la version 1.0, select n'existe pas.

  9. #9
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    tu es grand

    (petite parenthese dans ce thread)
    petite demande comme ça,
    justement oui je suis en xslt 2.0...est ce que cela peux m apporter des ennuis... puisqu apparement tout le monde dev en xsl 1.0... ce que je ne comprend pas trop.

  10. #10
    Membre régulier Avatar de toxine
    Inscrit en
    Juin 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2004
    Messages : 78
    Points : 78
    Points
    78
    Par défaut
    Pour être absolument exact , voici le xslt qui correspond à 100% à mes attentes : (en fait ce XML sert à alimenter une web treeview obout).
    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
    <?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" indent="yes" />
    	<!--  NOEUD RACINE -->
    	<xsl:template match="MENUS">
    		<XML>
    		<xsl:attribute name="type">text/xml</xsl:attribute>
    			<root>
    				<xsl:apply-templates select="MENU" />
    			</root>
    		</XML>
    	</xsl:template>
    	<!-- MENU -->
    	<xsl:template match="MENU"> 
    	<xsl:variable name="name" select="concat('a', translate(@tid,'.','_'))"/> 
    	<xsl:element name="{$name}"> 
    		<xsl:attribute name="html"><xsl:value-of select="@nom"/></xsl:attribute> 
    		<xsl:attribute name="img">Folder.gif</xsl:attribute> 
    		<xsl:attribute name="exp">True</xsl:attribute> 
    		<xsl:attribute name="url"></xsl:attribute>
    		<xsl:if test="MENU">
    			<xsl:apply-templates select="MENU" />
    		</xsl:if>
    	</xsl:element> 
    	</xsl:template>
    </xsl:stylesheet>
    (il fallait que j'applique ce template de façon récursive aux noeuds de mon XML)
    Merci beaucoup à vous 2

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

Discussions similaires

  1. [XSLT] Convertir toutes les noms de balise en minuscule ?
    Par ghohm dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/07/2006, 12h49
  2. Changer les noms de colonnes dans un formulaire
    Par cakeby dans le forum Access
    Réponses: 1
    Dernier message: 06/01/2006, 21h32
  3. [XSLT] Changer le nom des éléments...
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 14/11/2005, 11h00
  4. [XSLT] comment afficher tous les noms de balises
    Par stanilas dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/11/2005, 22h24
  5. [XML] Accent dans les noms de balises
    Par virgul dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 09/03/2005, 13h42

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