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] Supprimer certains attributes xmlns


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 51
    Points : 36
    Points
    36
    Par défaut [XSLT] Supprimer certains attributes xmlns
    Bonjour,

    J'ai un problème pour purger un fichier XML de certain namespace.

    Voici Mon 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?xml version="1.0" encoding="UTF-8"?>
    <Root xmlns="http://www.toto.fr/toto/XML">
    	<Private type="Voiture">1000</Private>
    	<Private type="Moto">50<my:Modele xmlns:my="http://www.tata.fr/modele/xml" max="40">
    			<Element1 xmlns:my="http://www.tata.fr/modele/xml">
    				<SousElement desc="a" id="1" name="fbvdfg" ref="G401"/>
    				<SousElement desc="b" id="2" name="fgg" ref="G402"/>
    				<SousElement desc="c" id="3" name="bbhfg" ref="G403"/>
    				<SousElement desc="d" id="4" name="sfd" ref="G404"/>
    			</Element1>
    			<Element2>
    				<SousElment desc="d" id="1" name="gffgg" ref="G401"/>
    				<SousElment desc="e" id="2" name="dgd" ref="G402"/>
    				<SousElment desc="f" id="3" name="dg" ref="G403"/>
    				<SousElment desc="g" id="4" name="dfg" ref="G404"/>
    			</Element2>
    		</my:Modele>
    	</Private>
    	<Private type="Camion">3</Private>
    	<Garage numero="1">
    		<Atelier desc="atelier de mécanique" nbouvrier="6">
    			<Outils desc="Pont" name="tyu"/>
    			<Outils desc="Pont" name="fgdsfr"/>
    		</Atelier>
    	</Garage>
    </Root>
    Je voudrais pouvoir créer une recopie de ce fichier en supprimant l'attribut xmlns="http://www.toto.fr/toto/XML" de l'élément Root mais sans supprimer le namespace xmlns:my="http://www.tata.fr/modele/xml" définie dans les sous éléments.

    Je connais le namespace à supprimer mais pas le namespace à garder. POur résumer je voudrais garder les namespace différent de "http://www.toto.fr/toto/XML"

    J'ai écris cette feuille de style mais dans le résultat tous les attributs xmlns ont disparu.
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    	xmlns:gar="http://www.toto.fr/toto/XML" 
    	exclude-result-prefixes="gar">
     
    	<xsl:template match="/">
    		<xsl:apply-templates select="gar:*"/>
    	</xsl:template>
     
    	<xsl:template match="gar:*">
    		<xsl:choose>
    			<xsl:when test="namespace-uri() = 'http://www.toto.fr/toto/XML'">
    				<xsl:element name="{local-name()}">
    					 <xsl:apply-templates select="@*|node()"/>
    				</xsl:element>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:copy-of select="current()"></xsl:copy-of>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
     
    	<xsl:template match="@*">
    		<xsl:attribute name="{local-name()}">
    			  <xsl:value-of select="."/>
    		</xsl:attribute>
    	</xsl:template>
     
    </xsl:stylesheet>
    Le résultat que je voudrais obtenir :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <Root>
    	<Private type="Voiture">1000</Private>
    	<Private type="Moto">50<my:Modele xmlns:my="http://www.tata.fr/modele/xml" max="40">
    			<Element1 xmlns:my="http://www.tata.fr/modele/xml">
    				<SousElement desc="a" id="1" name="fbvdfg" ref="G401"/>
    				<SousElement desc="b" id="2" name="fgg" ref="G402"/>
    				<SousElement desc="c" id="3" name="bbhfg" ref="G403"/>
    				<SousElement desc="d" id="4" name="sfd" ref="G404"/>
    			</Element1>
    			<Element2>
    				<SousElment desc="d" id="1" name="gffgg" ref="G401"/>
    				<SousElment desc="e" id="2" name="dgd" ref="G402"/>
    				<SousElment desc="f" id="3" name="dg" ref="G403"/>
    				<SousElment desc="g" id="4" name="dfg" ref="G404"/>
    			</Element2>
    		</my:Modele>
    	</Private>
    	<Private type="Camion">3</Private>
    	<Garage numero="1">
    		<Atelier desc="atelier de mécanique" nbouvrier="6">
    			<Outils desc="Pont" name="tyu"/>
    			<Outils desc="Pont" name="fgdsfr"/>
    		</Atelier>
    	</Garage>
    </Root>

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Tu as oublié de définir un template pour les éléments dont le namespace n'est pas 'gar'. Du coup ton élément <my:Modele> disparaît, et c'est eux les plus à même d'ajouter le namespace 'my'.

    - Ton template sur gar:*, tu devrais en faire un template sur tous les éléments : *

    Ensuite, ton <xsl:choose> se charge de faire la différence entre ceux qui ont le namespace gar et les autres.

    => Mais maintenant, les enfants de <my:Modele> retrouvent leur namespace gar !

    Oui, parce que <xsl:copy-of> copie les nœuds et leur descendance tels que trouvés, sans appliquer de template.

    Il faut le remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:otherwise>
      <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
    </xsl:otherwise>
    Qui va copier le nœud lui-même et ses namespaces, mais appliquer les templates à ses descendants et à ses attributs.

    Et voilà !
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Merci pour ton aide. J'ai essayé d'appliquer ton conseil seulement j'obtiends un attribut xmlns="http://www.toto.fr/toto/XML" en trop sur mon élément "my:Modele" et je ne comprends pas pourquoi.

    Une idée pour me dépatouiller ?

    Ma feuille de style :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:gar="http://www.toto.fr/toto/XML" 
        >
     
        <xsl:template match="/">
            <xsl:apply-templates select="*"/>
        </xsl:template>
     
        <xsl:template match="*">
            <xsl:choose>
                <xsl:when test="namespace-uri() = 'http://www.toto.fr/toto/XML'">
                    <xsl:element name="{local-name()}">
                         <xsl:apply-templates select="@*|node()"/>
                    </xsl:element>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="current()"></xsl:copy-of>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>
     
        <xsl:template match="@*">
            <xsl:attribute name="{local-name()}">
                  <xsl:value-of select="."/>
            </xsl:attribute>
        </xsl:template>
     
    </xsl:stylesheet>
    Mon résultat avec l'attribut xmlns="http://www.toto.fr/toto/XML"qui ce trouve ajouter sur l'élément my:Modele

    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"?>
    <Root>
        <Private type="Voiture">1000</Private>
        <Private type="Moto">50<my:Modele xmlns:my="http://www.tata.fr/modele/xml" max="40" xmlns="http://www.toto.fr/toto/XML">
                <Element1 xmlns:my="http://www.tata.fr/modele/xml">
                    <SousElement desc="a" id="1" name="fbvdfg" ref="G401"/>
                    <SousElement desc="b" id="2" name="fgg" ref="G402"/>
                    <SousElement desc="c" id="3" name="bbhfg" ref="G403"/>
                    <SousElement desc="d" id="4" name="sfd" ref="G404"/>
                </Element1>
                <Element2>
                    <SousElment desc="d" id="1" name="gffgg" ref="G401"/>
                    <SousElment desc="e" id="2" name="dgd" ref="G402"/>
                    <SousElment desc="f" id="3" name="dg" ref="G403"/>
                    <SousElment desc="g" id="4" name="dfg" ref="G404"/>
                </Element2>
            </my:Modele>
        </Private>
        <Private type="Camion">3</Private>
        <Garage numero="1">
            <Atelier desc="atelier de mécanique" nbouvrier="6">
                <Outils desc="Pont" name="tyu"/>
                <Outils desc="Pont" name="fgdsfr"/>
            </Atelier>
        </Garage>
    </Root>

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Citation Envoyé par Josy Voir le message
    Merci pour ton aide. J'ai essayé d'appliquer ton conseil seulement j'obtiends un attribut xmlns="http://www.toto.fr/toto/XML" en trop sur mon élément "my:Modele" et je ne comprends pas pourquoi.

    Une idée pour me dépatouiller ?
    Oups, en effet, c'est normal. Le processeur XSLT avec lequel j'ai testé a un bug, il ne m'a pas mis ce xmlns.

    Mais c'est normal qu'il soit là : <xsl:copy> copie un nœud et tous ses namespaces, or dans ton document d'origine, le namespace "http://www.toto.fr/toto/XML" s'applique à tout le document. Donc toute copie d'élément doit le restaurer s'il n'est pas déjà là.

    Nous allons devoir faire sans copie. Remplacer la copie par :

    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:otherwise>
      <!-- Insère l'élément avec son nom qualifié et l'URI de namespace correspondante -->
      <xsl:element name="{name()}" namespace="{namespace-uri()}">
     
        <!-- Insère les éventuels namespaces de l'élément, sauf celui qu'on veut pas -->
        <xsl:for-each select="namespace::*[. != 'http://www.toto.fr/toto/XML']">
          <xsl:copy/>
        </xsl:for-each>
     
        <!-- applique les templates sur le contenu -->
        <xsl:apply-templates select="@*|node()"/>
     
      </xsl:element>
    </xsl:otherwise>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Merci, on avance mais y reste quelques soucis

    - sous l'élément "my:Modele" un nouvel attribut my="http://www.tata.fr/modele/xml" est créé
    - l'élément "Element1" à perdu son attribut xmlns:my="http://www.tata.fr/modele/xml" qui ne corresponds pas à celui que on veut supprimer

    J'avoue que là je commence à être perdu

    Nouvel XSL :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gar="http://www.toto.fr/toto/XML">
        <xsl:template match="/">
            <xsl:apply-templates select="*"/>
        </xsl:template>
        <xsl:template match="*">
            <xsl:choose>
                <xsl:when test="namespace-uri() = 'http://www.toto.fr/toto/XML'">
                    <xsl:element name="{local-name()}">
                        <xsl:apply-templates select="@*|node()"/>
                    </xsl:element>
                </xsl:when>
                <xsl:otherwise>
                    <!-- Insère l'élément avec son nom qualifié et l'URI de namespace correspondante -->
                    <xsl:element name="{name()}" namespace="{namespace-uri()}">
                        <!-- Insère les éventuels namespaces de l'élément, sauf celui qu'on veut pas -->
                        <xsl:for-each select="namespace::*[. != 'http://www.toto.fr/toto/XML']">
                            <xsl:copy/>
                        </xsl:for-each>
                        <!-- applique les templates sur le contenu -->
                        <xsl:apply-templates select="@*|node()"/>
                    </xsl:element>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>
        <xsl:template match="@*">
            <xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>
        </xsl:template>
    </xsl:stylesheet>
    Nouvel résultat 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
    25
    26
    <?xml version="1.0" encoding="UTF-8"?>
    <Root>
        <Private type="Voiture">1000</Private>
        <Private type="Moto">50<my:Modele xmlns:my="http://www.tata.fr/modele/xml" my="http://www.tata.fr/modele/xml" max="40">
                <Element1>
                    <SousElement desc="a" id="1" name="fbvdfg" ref="G401"/>
                    <SousElement desc="b" id="2" name="fgg" ref="G402"/>
                    <SousElement desc="c" id="3" name="bbhfg" ref="G403"/>
                    <SousElement desc="d" id="4" name="sfd" ref="G404"/>
                </Element1>
                <Element2>
                    <SousElment desc="d" id="1" name="gffgg" ref="G401"/>
                    <SousElment desc="e" id="2" name="dgd" ref="G402"/>
                    <SousElment desc="f" id="3" name="dg" ref="G403"/>
                    <SousElment desc="g" id="4" name="dfg" ref="G404"/>
                </Element2>
            </my:Modele>
        </Private>
        <Private type="Camion">3</Private>
        <Garage numero="1">
            <Atelier desc="atelier de mécanique" nbouvrier="6">
                <Outils desc="Pont" name="tyu"/>
                <Outils desc="Pont" name="fgdsfr"/>
            </Atelier>
        </Garage>
    </Root>

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Citation Envoyé par Josy Voir le message
    - sous l'élément "my:Modele" un nouvel attribut my="http://www.tata.fr/modele/xml" est créé
    C'est un bug de ton processeur XSLT. Ils ont tous du mal avec l'axe namespace::
    Tant pis, vire le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!-- Insère les éventuels namespaces de l'élément, sauf celui qu'on veut pas -->
    <xsl:for-each select="namespace::*[. != 'http://www.toto.fr/toto/XML']">
      <xsl:copy/>
    </xsl:for-each>
    et prie pour que ça ne perde rien d'important.

    - l'élément "Element1" à perdu son attribut xmlns:my="http://www.tata.fr/modele/xml" qui ne corresponds pas à celui que on veut supprimer
    Sans importance, ce namespace est déjà hérité de son père <my:Modele>.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [XSLT] calcul profondeur d'un élément pour certain attribut
    Par knebhi dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/06/2010, 14h20
  2. Réponses: 3
    Dernier message: 06/01/2009, 13h39
  3. [MSXML3][VBA] Attribut xmlns de la balise racine
    Par Rank dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 08/12/2005, 18h50
  4. [XSLT] Dédoublonner des attributs
    Par 242 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 10/11/2005, 15h44
  5. XMLCursor : Supprimer un attribut
    Par Sylvain James dans le forum XMLRAD
    Réponses: 4
    Dernier message: 02/10/2003, 16h57

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