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 :

changer le Root element et le namespace [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut changer le Root element et le namespace
    Bonjour,
    Puis-je soumettre à votre sagacité ce casse-tête frustrant ?

    J'ai un fichier XML de départ comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <dataroot>
    	<document>
    		<fileN>51432.pdf</fileN>
    		<INVC>51432</INVC>
    		<properties>
    			<invoiceNumber>51432</invoiceNumber>
    			<invoiceD>2018-01-24</invoiceD>
    			<customerNbr>5666</customerNbr>
    		</properties>
    	</document>
    </dataroot>
    Je désirer transformer ce fichier XML en un autre fichier XML en transformant l'élément racine du fichier.
    Au lieu de
    <dataroot>
    je désire obtenir
    <EInvoiceF xmlns="http://tatra.com/ECM">

    J'ai écris la transformation 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
    <?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"/>
     
        <!-- Rename <dataroot> element to <EInvoiceF> -->
        <xsl:template match="dataroot">
            <EInvoiceF xmlns="http://tatra.com/ECM" >
                <xsl:apply-templates select="@*|node()"/>
            </EInvoiceF>
        </xsl:template>
     
        <!--  Remove namespace declarations -->
        <xsl:template match="*">
            <xsl:element name="{name()}">
                <xsl:apply-templates select="@*|node()"/>
            </xsl:element>
        </xsl:template>
     
    </xsl:stylesheet>
    qui fonctionne mais pas parfaitement.
    J'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8"?>
    <EInvoiceF xmlns="http://tatra.com/ECM">
    	<document xmlns="">
    		<fileN>51432.pdf</fileN>
    		<INVC>514   ....
    ce <document xmlns=""> ne me convient pas.
    je voudrais simplement <document> sans le xmlns=""

    Pourquoi m'ajoute-t-il ce xmlns="" et comment puis-je m'en débarasser ?

    Merci pour votre précieuse aide.

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Comme ça.
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!--
    <xsl:element name="{name()}">
    -->
    <xsl:element name="{name()}" namespace="http://tatra/ECM">

  3. #3
    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
    Pour rappeler ce qui se passe : c'est une question de syntaxe.

    En syntaxe XML, tous les éléments descendants héritent du namespace de l'élément ascendant.

    Donc si la racine n'a pas de namespace, les autres éléments n'en ont pas non plus. Si la racine a un namespace, les autres l'ont aussi.

    Mais ça c'est juste la manière de l'écrire.
    Quand on crée un document XML avec des éléments dedans, par exemple en XSLT, là il n'y a pas d'héritage implicite qui tienne. Chaque élément a le nom, et le namespace, qu'on lui dit d'avoir. Et personne ne s'intéresse aux éléments ascendants, qui d'ailleurs ne sont pas tenus d'exister à ce moment-là.

    En créant donc, un élément <EInvoiceF> avec un namespace, puis en copiant les autres éléments tels que sans namespace, on dit que dans le document à créer, la racine a un namespace et les autres éléments n'en ont pas.
    Puisque la syntaxe implicite dit que le namespace est hérité, et que dans le document qu'on vient de créer seule la racine a un namespace, il faut donc enlever le namespace hérité de la racine. Ce qui se fait avec xmlns="" .

    Si on ne veut pas ce xmlns="" ça veut dire qu'on ne veut pas empêcher les éléments d'hériter du namespace de la racine. Donc qu'on veut qu'ils aient le même namespace que la racine.
    Donc il faut les créer avec le même namespace que la racine.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Merci pour vos explications.
    Voici la solution que j'ai mise en oeuvre
    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
    <?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="@*|node()">
    	<xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
     
    <!-- Rename <dataroot> element to <EInvoiceF> -->
        <xsl:template match="dataroot">
            <EInvoiceF xmlns="http://tatra.com/ECM" >
                <xsl:apply-templates select="@*|node()"/>
            </EInvoiceF>
        </xsl:template>
     
        <!--  Remove other namespace declarations and force my xmlns -->
        <xsl:template match="*">
            <xsl:element name="{local-name()}" xmlns="http://tatra.com/ECM">
                <xsl:apply-templates select="@*|node()"/>
            </xsl:element>
        </xsl:template>
     
    </xsl:stylesheet>

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 11/06/2009, 20h46
  2. Enlever les attribut ou element ayant un namespace spécifique
    Par totoen dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 18/03/2009, 16h10
  3. Réponses: 3
    Dernier message: 22/02/2008, 12h06
  4. changer attributs d'elements dans un div
    Par Emcy dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 23/02/2007, 09h00
  5. [Aps net 1.1]There are multiple root elements
    Par ChristopheOce dans le forum ASP.NET
    Réponses: 5
    Dernier message: 11/12/2006, 10h03

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