1. #1
    Membre averti
    Inscrit en
    février 2011
    Messages
    347
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 347
    Points : 413
    Points
    413

    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 averti
    Inscrit en
    février 2011
    Messages
    347
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 347
    Points : 413
    Points
    413

    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 chevronné
    Inscrit en
    octobre 2011
    Messages
    1 093
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 093
    Points : 1 894
    Points
    1 894

    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
    11 283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 283
    Points : 19 121
    Points
    19 121

    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 averti
    Inscrit en
    février 2011
    Messages
    347
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 347
    Points : 413
    Points
    413

    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