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 :

Splitter un fichier XML avec un header fixe


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Par défaut Splitter un fichier XML avec un header fixe
    Bonjour,

    je suis débutant en langage xslt et je pédale dans la semoule avec mon fichier xml, je m'explique :

    je reçois un fichier xml du type
    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
    <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02 pacs.003.001.02.xsd">
    	<FIToFICstmrDrctDbt>
    		<GrpHdr>
                           <MsgId>14992654380</MsgId>
    			<NbOfTxs>3</NbOfTxs>
    			<TtlIntrBkSttlmAmt Ccy="EUR">145.00</TtlIntrBkSttlmAmt>
                    </GrpHdr>
    		<DrctDbtTxInf>
                           <TxId>12341</TxId>
                           <IntrBkSttlmAmt Ccy="EUR">20.00</IntrBkSttlmAmt>
                    </DrctDbtTxInf>
                    <DrctDbtTxInf>
                           <TxId>12342</TxId>
                           <IntrBkSttlmAmt Ccy="EUR">50.00</IntrBkSttlmAmt>
                    </DrctDbtTxInf>
                    <DrctDbtTxInf>
                           <TxId>12343</TxId>
                           <IntrBkSttlmAmt Ccy="EUR">75.00</IntrBkSttlmAmt>
                    </DrctDbtTxInf>
           </FIToFICstmrDrctDbt>
    </Document>
    et je dois en faire 3 fichiers (pour cet exemple) mais en gardant un header à chaque fois adapté (cf données en gras):

    1er fichier
    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
    <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02 pacs.003.001.02.xsd">
    	<FIToFICstmrDrctDbt>
    		<GrpHdr>
                           <MsgId>14992654380</MsgId>
    			<NbOfTxs>1</NbOfTxs>
    			<TtlIntrBkSttlmAmt Ccy="EUR">20.00</TtlIntrBkSttlmAmt>
                    </GrpHdr>
    		<DrctDbtTxInf>
                           <TxId>12341</TxId>
                           <IntrBkSttlmAmt Ccy="EUR">20.00</IntrBkSttlmAmt>
                    </DrctDbtTxInf>
            </FIToFICstmrDrctDbt>
    </Document>
    2ème fichier :

    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
    <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02 pacs.003.001.02.xsd">
    	<FIToFICstmrDrctDbt>
    		<GrpHdr>
                           <MsgId>14992654380</MsgId>
    			<NbOfTxs>1</NbOfTxs>
    			<TtlIntrBkSttlmAmt Ccy="EUR">50.00</TtlIntrBkSttlmAmt>
                    </GrpHdr>
    		<DrctDbtTxInf>
                           <TxId>12342</TxId>
                           <IntrBkSttlmAmt Ccy="EUR">50.00</IntrBkSttlmAmt>
                    </DrctDbtTxInf>
            </FIToFICstmrDrctDbt>
    </Document>

    3ème fichier :

    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
    <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02 pacs.003.001.02.xsd">
    	<FIToFICstmrDrctDbt>
    		<GrpHdr>
                           <MsgId>14992654380</MsgId>
    			<NbOfTxs>1</NbOfTxs>
    			<TtlIntrBkSttlmAmt Ccy="EUR">75.00</TtlIntrBkSttlmAmt>
                    </GrpHdr>
    		<DrctDbtTxInf>
                           <TxId>12343</TxId>
                           <IntrBkSttlmAmt Ccy="EUR">75.00</IntrBkSttlmAmt>
                    </DrctDbtTxInf>
            </FIToFICstmrDrctDbt>
    </Document>

    J'essaye d'utiliser XSLT pour transformer tout ça mais à part copier l'intégralité du fichier, et initialiser <NbOfTxs> à 1, mes différents essais avec ce que je trouve sur le web n'aboutissent pas.


    fichier xsl:

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pain="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02">
     
    	<xsl:output method="xml"/>
     
     
    <!-- copie fichier  -->
    	<xsl:template match="@*">
      		<xsl:copy />
    	</xsl:template>
     
    	<xsl:template match="*">
     		<xsl:element name="{name()}" >
        		<xsl:apply-templates select="* | text() | @*"/>
      		</xsl:element>
    	</xsl:template>
     
    <!-- modif zone  -->
    <xsl:template match="pain:GrpHdr/pain:NbOfTxs">
    		<xsl:element name="NbOfTxs">
    			<xsl:value-of select="1"/>
    		</xsl:element>
    	</xsl:template>

    Merci pour votre aide

  2. #2
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Ecrire dans plusieurs document en sortie n'est possible qu'avec XSLT 2.0, en utilisant la méthode result-document:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:result-document method="xml" href="output_file.xml">
    Du coup il faudrait boucler sur les éléments DrctDbtTxInf et recréer un nouveau document pour chacun d'eux.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Par défaut
    Bonjour et merci pour ta réponse :

    je viens d'essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <!-- split file -->
    	<xsl:template match="*">
      		<xsl:for-each select="pain:FIToFICstmrDrctDbt/pain:DrctDbtTxInf">
        		<xsl:result-document method="xml" href="output_file.xml">
          			<xsl:copy-of select="."/>
        		</xsl:result-document>
      		</xsl:for-each>
    	</xsl:template>
    mais ça plante ("impossible de compiler la feuille de style")

    par contre c'est vrai que je ne suis pas à l'aise avec les symboles, comme par exemple ceux utilisés pour la copie... donc j'ai peut être fait une erreur !

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Par défaut
    je viens d'ajouter version="2.0" à la balise <xsl:stylesheet>, je n'ai plus d'erreur mais le process bloque. Je pense que c'est un autre problème (externe à xslt)

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    C'est fort probable. À la base XSLT c'est fait pour transformer un seul fichier (et d'éventuelles annexes) en un seul autre fichier. Les processus basés dessus ont donc tendance à n'envisager que ça.

    Difficile de te guider sans rien connaître du processus en question. Moi je commencerais par étudier pourquoi ça le fait planter et si on peut pas y faire quelque chose.
    Mais si c'est trop dur, je me contenterais de parser d'abord le XML, compter en combien de fichiers il faut l'éclater, puis faire une transformation par fichier à créer, avec en paramètre de quoi indiquer que mettre dedans.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Par défaut
    Re-bonjour !!

    Le problème étant situé en amont (route camel), j'ai changé de tactique et j'arrive avec un seul fichier en entrée (pour un fichier en sortie). Autrement dit tout se joue dans le fichier xslt

    Fichier en entrée :
    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
    <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02 pacs.003.001.02.xsd">
    	<FIToFICstmrDrctDbt>
    		<GrpHdr>
                           <MsgId>14992654380</MsgId>
    			<NbOfTxs>3</NbOfTxs>
    			<TtlIntrBkSttlmAmt Ccy="EUR">145.00</TtlIntrBkSttlmAmt>
                    </GrpHdr>
    		<DrctDbtTxInf>
                           <TxId>12341</TxId>
                           <IntrBkSttlmAmt Ccy="EUR">20.00</IntrBkSttlmAmt>
                    </DrctDbtTxInf>
           </FIToFICstmrDrctDbt>
    </Document>
    Comme vous l'avez remarqué je constitue le fichier à traiter avec le header du fichier général
    Donc ce qu'il me reste à faire est de :
    - modifier le texte de la balise <NbOfTxs> pour le mettre à 1
    - remplacer le texte de la balise <TtlIntrBkSttlmAmt> du header par celui de la balise <IntrBkSttlmAmt> du détail

    Voici mon fichier xslt, merci de ne pas se moquer

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!--Generated by SWIFTStandards Workstation (build:R7.1.30.4) on 2012 Jun 07 20:47:19-->
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pain="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02 pacs.003.001.02.xsd">
     
    	<!-- copie d'une balise -->
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
     
     	<xsl:template match="pain:GrpHdr/pain:TtlIntrBkSttlmAmt">
     		<xsl:value-of select="pain:DrctDbtTxInf/pain:TtlIntrBkSttlmAmt"/>
     	</xsl:template>	
     
    	<!-- <xsl:template match="@*">
      		<xsl:copy/>
    	</xsl:template> -->
     
     
    </xsl:stylesheet>

    Ce qui a pour résultat de me supprimer la balise TtlIntrBkSttlmAmt....


    Comment fait on pour remplacer le contenu d'une balise par le contenu d'une autre ?

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

Discussions similaires

  1. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  2. Valider un fichier XML avec un Schema
    Par Groove dans le forum Valider
    Réponses: 4
    Dernier message: 09/11/2005, 08h15
  3. extraire un fichier d'un fichier XML avec XSL ?
    Par pirbd dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 14/09/2005, 10h31
  4. Modification de fichier XML avec XSLT
    Par osmoz dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/07/2005, 11h04
  5. [DOM] [Débutant(e)] Modifier un fichier XML avec DOM
    Par macks dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 05/07/2005, 14h13

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