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 :

appliquer 2 préfixes de 2 xmlns à un fichier sans 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 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 é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
    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 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
    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
    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
    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, 09h09
  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, 16h13
  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, 13h20
  4. Réponses: 5
    Dernier message: 22/07/2005, 23h40
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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