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 appliquer 2 préfixes de 2 xmlns à un fichier sans namespace

    Bonjour,

    Au départ, j'ai un fichier XML avec mes données mais sans namespace/espace de nom et sans préfixe :
    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"?>
    <LRFacturasEmitidas>
    	<RegistroLRFacturasEmitidas>
    		<Periodo>
    			<Ejercicio>2017</Ejercicio>
    			<Periodo>01</Periodo>
    		</Periodo>
    		<FacturaExpedida>
    			<TipoFactura>T1</TipoFactura>
    			<Regimen>R1</Regimen>
    			<ImporteTotal>383.81</ImporteTotal>
    		</FacturaExpedida>
    	</RegistroLRFacturasEmitidas>
    	<RegistroLRFacturasEmitidas>
    		<Periodo>
    			<Ejercicio>2017</Ejercicio>
    			<Periodo>01</Periodo>
    		</Periodo>
    		<FacturaExpedida>
    			<TipoFactura>T1</TipoFactura>
    			<Regimen>R1</Regimen>
    			<ImporteTotal>177.14</ImporteTotal>
    		</FacturaExpedida>
    	</RegistroLRFacturasEmitidas>
    </LRFacturasEmitidas>
    Au début du fichier XML, on voit une définition on-ne-peut-plus-simple.

    à l'arrivée, je voudrais obtenir ceci où il y a deux namespaces et chaque élément fait référence à l'un ou l'autre namespace sii ou siiLR :
    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"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:siiLR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd" 
    xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd">
    <siiLR:LRFacturasEmitidas>
    	<siiLR:RegistroLRFacturasEmitidas>
    		<sii:Periodo>
    			<sii:Ejercicio>2017</sii:Ejercicio>
    			<sii:Periodo>01</sii:Periodo>
    		</sii:Periodo>
    		<siiLR:FacturaExpedida>
    			<sii:TipoFactura>T1</sii:TipoFactura>
    			<sii:Regimen>R1</sii:Regimen>
    			<sii:ImporteTotal>383.81</sii:ImporteTotal>
    		</siiLR:FacturaExpedida>
    	</siiLR:RegistroLRFacturasEmitidas>
    	<siiLR:RegistroLRFacturasEmitidas>
    		<sii:Periodo>
    			<sii:Ejercicio>2017</sii:Ejercicio>
    			<sii:Periodo>01</sii:Periodo>
    		</sii:Periodo>
    		<siiLR:FacturaExpedida>
    			<sii:TipoFactura>T1</sii:TipoFactura>
    			<sii:Regimen>R1</sii:Regimen>
    			<sii:ImporteTotal>177.14</sii:ImporteTotal>
    		</siiLR:FacturaExpedida>
    	</siiLR:RegistroLRFacturasEmitidas>
    </siiLR:LRFacturasEmitidas>
    </soapenv:Envelope>
    Comme vous voyez, certains noeuds ont le préfixe siiLR et certains noeuds fils ont un préfixe sii.

    Je suis parvenu à écrire une transformation xslt pour avoir les deux définitions en début de XML et pour avoir tous les noeuds avec le préfixe sii LR ou tous les noeuds avec sii mais je ne parviens pas à avoir les deux en même temps.

    Comment dois-je m'y prendre pour aboutir à
    • une définition contenant la référence aux 2 namespaces
    • les noeuds principaux avec le préfixe siiLR
    • les noeuds secondaires avec le préfixe sii

    Merci pour votre aide.

  2. #2
    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

    Comment dois-je m'y prendre pour aboutir à

    une définition contenant la référence aux 2 namespaces
    les noeuds principaux avec le préfixe siiLR
    les noeuds secondaires avec le préfixe sii
    Il se peut que le sens de "principaux" et de "secondaires" soit clair pour vous, mais non, pas clair du tout pour les lecteurs, je pense. Comme aucune référence est faite sur le nom concret des balises, je peux vous donner une interprétation et c'est le mieux ce que je puisse imaginer tout en restant aussi général que possible.
    Code xsl : 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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:siiLR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd" 
        xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd"
    >
    <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="yes" />
    <xsl:template match="/">
        <soapenv:Envelope>
            <xsl:apply-templates select="*" />
        </soapenv:Envelope>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="siiLR:{local-name()}">
            <xsl:copy-of select="@*" />
            <xsl:apply-templates select="*|text()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="*[(count(ancestor::*) &gt;= 2 and count(preceding-sibling::*) = 0) or count(*)=0]">
        <xsl:element name="sii:{local-name()}">
            <xsl:copy-of select="@*" />
            <xsl:apply-templates select="*|text()" />
        </xsl:element>
    </xsl:template>
    </xsl:stylesheet>

  3. #3
    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

    Ooops, désolé si mon explication n'était pas claire. c'est le problème lorsqu'on est le nez dans le guidon: on ne se rend pas compte de la vue que les autres peuvent avoir.

    Mille fois merci pour cette solution qui marche super bien !

    Je suis impressionné par le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*[(count(ancestor::*) &gt;= 2 and count(preceding-sibling::*) = 0) or count(*)=0]">
    J'avoue que j'étais loin de penser à ça. Merci. La solution que j'aurais mise en place aurait été moins générique et nettement moins élégante.
    Je n'avais pas pensé non plus au
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="*|text()" />
    et c'est là que je butais.

    Malgré mes instructions peu claires, vous êtes parvenu à me mettre sur la voie au delà de toutes mes espérances. Encore merci.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 282
    Points : 19 115
    Points
    19 115

    Par défaut

    Personnellement j'aurais fait une liste des noms d'éléments qui doivent utiliser le préfixe sii: . Ou alors, vu qu'il n'y en a pas beaucoup, j'aurais fait un template qui les nomme tous. Mais bon, comme le signale tsuji, difficile de deviner ce qui est le mieux pour ta situation.

    Pour information,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="*|text()" />
    est presque équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="node()" />
    ce qui peut se noter en version courte :

    Autrement dit, la balise apply-templates existe précisément pour s'en servir comme ça.

    Je dis "presque équivalent" car ce n'est pas exactement la même chose, mais pour tes fichiers à toi et pour la plupart, ça fait la même chose.

    Je suis pas sûr de bien comprendre ce qui motivait le *|text()
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/03/2016, 10h09
  2. Récupérer un nom de fichier sans extension
    Par OxN dans le forum Général Java
    Réponses: 13
    Dernier message: 01/08/2011, 17h13
  3. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 14h20
  4. Réponses: 5
    Dernier message: 23/07/2005, 00h40
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 16h44

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