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 pour changer le nom de la racine et le namespace


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut XSLT pour changer le nom de la racine et le namespace
    Bonjour,

    Microsoft Access exporte des fichiers XML qui commencent toujours par "dataroot". A part Bill G, cette racine dataroot n'intéresse personne. Comment puis-je la changer ?
    J'ai des fichiers de départ comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2017-11-16T17:38:14">
    	<Tag>AAA</Tag>
    	<Tag>BBB</Tag>
    </dataroot>
    et je désire obtenir des fichiers avec un nouveau nom pour le Root Element et un nouveau namespace comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8"?>
    <Document xmlns="urn:iso:xxxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    	<Tag>AAA</Tag>
    	<Tag>BBB</Tag>
    </Document>
    Les transformations xslt que j'ai écrites ne me mènent nulle part.
    Merci pour votre aide.

  2. #2
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    Si je fais ceci :
    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"/>
     
    	<xsl:template match="@*|node()">
    		<xsl:copy >
    			<xsl:apply-templates select="@*|node()"/>
    		</xsl:copy>
    	</xsl:template>	
     
    	<xsl:template match="/*">
    		<Document xmlns="urn:iso:xxxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    			<xsl:copy>
    				<xsl:apply-templates select="node()"/>
    			</xsl:copy> 
    		</Document>
    	</xsl:template>
     
    </xsl:stylesheet>
    J'obtiens un XML qui contient toujours ce fichu dataroot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="UTF-8"?>
    <Document xmlns="urn:iso:xxxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    	<dataroot xmlns="" xmlns:od="urn:schemas-microsoft-com:officedata">
    		<Tag>AAA</Tag>
    		<Tag>BBB</Tag>
    	</dataroot>
    </Document>
    Ce n'est pas ce que je veux. Comment puis-je me débarasser de ce dataroot ?

    Merci pour votre aide.

  3. #3
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Vous pouvez considérer faire ça.
    Code xml : 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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:od="urn:schemas-microsoft-com:officedata"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    >
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" encoding="utf-8" />
    <xsl:template match="*[ancestor::dataroot]">
        <xsl:element name="{local-name()}" namespace="urn:iso:xxxxx">
            <xsl:apply-templates select="*|@*|text()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="dataroot">
        <Document xmlns="urn:iso:xxxxx">
            <xsl:apply-templates select="*|@*|text()" />
        </Document>
    </xsl:template>
    </xsl:stylesheet>

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par PipoWIL Voir le message
    Comment puis-je me débarasser de ce dataroot ?
    En enlevant le <xsl:copy> que tu fais sur le match="/*" qui s'applique sur ce dataroot. Si tu ne le veux pas, ne le copie pas.

    Mais comme l'illustre tsuji, si tu veux que tes éléments <Tag> soient dans le même namespace que ton nouvel élément <Document>, tu ne peux pas les copier : les originaux ne sont pas dans ce namespace !
    Il va falloir les recréer avec le même nom et le namespace de ton document.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    Merci beaucoup tsuji, de m'avoir donné la solution. Cela fonctionne bien.
    Votre xslt garde la "date generated" de microsoft et procure un xml du genre de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Document xmlns="urn:iso:xxxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    2017-11-21T09:39:16
    <CstmrDrctDbtInitn>....
    J'ai donc changé le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="@*|*|text()"/>
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="*|text()"/>
    Comme je sais que, à ce stade, je n'ai pas d'attribut dans aucune balise du XML, je me suis permis de supprimer ce @*
    J'utilise donc ce 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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    	<xsl:strip-space elements="*"/>
    	<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" encoding="utf-8"/>
     
    	<xsl:template match="*[ancestor::dataroot]">
    		<xsl:element name="{local-name()}" namespace="urn:iso:xxxxx">
    			<xsl:apply-templates select="*|text()"/>
    		</xsl:element>
    	</xsl:template>
    	<xsl:template match="dataroot">
    		<Document xmlns="urn:iso:xxxxx">
    			<xsl:apply-templates select="*|text()"/>
    		</Document>
    	</xsl:template>
    </xsl:stylesheet>
    Cela fonctionne bien. Encore merci.

Discussions similaires

  1. Script pour changer le nom des fichiers
    Par MR-SMOOT dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 30/08/2014, 17h26
  2. moulinette pour changer des noms de colonnes
    Par salluste dans le forum Excel
    Réponses: 6
    Dernier message: 26/03/2014, 11h06
  3. [XSLT] pour récupérer le nom du fichier d'entrée
    Par alouani dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 20/06/2011, 11h14
  4. Comment changer le nom du répertoire racine d'un projet ?
    Par zerbynette dans le forum Eclipse C & C++
    Réponses: 1
    Dernier message: 20/01/2010, 12h09
  5. [XSLT] pour récupérer le nom du fichier d'entrée
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 31/05/2007, 11h58

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