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

  1. #1
    Membre du Club
    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
    Points : 45
    Points
    45
    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
    Expert confirmé
    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
    Points : 4 843
    Points
    4 843
    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 du Club
    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
    Points : 45
    Points
    45
    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 du Club
    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
    Points : 45
    Points
    45
    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 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    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.

  6. #6
    Membre du Club
    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
    Points : 45
    Points
    45
    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 ?

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par anakin59490 Voir le message
    Comment fait on pour remplacer le contenu d'une balise par le contenu d'une autre ?
    Comme ça, mais il faut pas oublier de remonter aux parents d'abord.

    <pain:DrctDbtTxInf> n'est pas à côté de <pain:TtlIntrBkSttlmAmt>, donc pain:DrctDbtTxInf/pain:TtlIntrBkSttlmAmt n'a pas de sens pendant un match sur pain:TtlIntrBkSttlmAmt.

  8. #8
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    Merci pour ta réponse


    d'abord, en effet il y avait une erreur de copier coller...j'avais essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="pain:GrpHdr/pain:TtlIntrBkSttlmAmt">
     		<xsl:value-of select="pain:DrctDbtTxInf/pain:IntrBkSttlmAmt"/>
     	</xsl:template>
    et non pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="pain:GrpHdr/pain:TtlIntrBkSttlmAmt">
     		<xsl:value-of select="pain:DrctDbtTxInf/pain:TtlIntrBkSttlmAmt"/>
     	</xsl:template>
    J'ai suivi ton conseil mais j'ai dû raté une marche....je viens d'essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="pain:TtlIntrBkSttlmAmt">
     		<xsl:value-of select="pain:FIToFICstmrDrctDbt/pain:DrctDbtTxInf/pain:IntrBkSttlmAmt"/>
     	</xsl:template>

  9. #9
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    Y'a du mieux !

    je viens d'essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="pain:TtlIntrBkSttlmAmt">
     		<xsl:value-of select="//pain:DrctDbtTxInf/pain:IntrBkSttlmAmt"/>
     	</xsl:template>

    Je récupére bien la valeur
    mais il n'a pas la balise

  10. #10
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    autrement dit j'obtiens :

    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>
    			20.00
                    </GrpHdr>
    		<DrctDbtTxInf>
                           <TxId>12341</TxId>
                           <IntrBkSttlmAmt Ccy="EUR">20.00</IntrBkSttlmAmt>
                    </DrctDbtTxInf>
           </FIToFICstmrDrctDbt>
    </Document>

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Pour avoir les balises c'est xsl:copy-of pas xsl:value-of.

    Et pour remonter au parent il suffit de faire ../ ; le grand-parent c'est ../../ et ainsi de suite.

  12. #12
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    xsl:copy-of fonctionne mais je cherche à garder le nom de la balise d'origine. je veux juste changer le montant


    autrement dit je cherche à avoir :

    <TtlIntrBkSttlmAmt Ccy="EUR">20.00</TtlIntrBkSttlmAmt>

    au lieu de
    <TtlIntrBkSttlmAmt Ccy="EUR">145.00</TtlIntrBkSttlmAmt>

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Le plus simple est de juste faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <laBaliseARefaire lAttributARefaire="{...}">
      <xsl:value-of select="..."/>
    </laBaliseARefaire>

  14. #14
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    Alors voici ce que j'ai fait pour la refaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="pain:TtlIntrBkSttlmAmt">
     		<xsl:element name="TtlIntrBkSttlmAmt">
     			<xsl:attribute name="Ccy">EUR</xsl:attribute>
     			<xsl:value-of select="//pain:IntrBkSttlmAmt"/>
     		</xsl:element>
     	</xsl:template>
    Mais il y a un dernier soucis, c'est qu'il me génére :

    <TtlIntrBkSttlmAmt xmlns="" Ccy="EUR">20.00</TtlIntrBkSttlmAmt>

    C'est possible de l'enlever ?

  15. #15
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    Presque !!

    je pensais avoir trouvé avec ça :

    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
    30
    31
    32
    33
    34
    35
    <?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="*">
    		<!-- retire les éléments s'ils existent -->
    		<xsl:element name="{local-name()}">
    			<!-- attributs -->
    			<xsl:for-each select="@*">
    				<!-- retire les attributs, s'ils existent -->
    				<xsl:attribute name="{local-name()}">
    				<xsl:value-of select="." />
    				</xsl:attribute>
    			</xsl:for-each>
    			<xsl:apply-templates />
    		</xsl:element>
    	</xsl:template>
     
     
     	<xsl:template match="pain:TtlIntrBkSttlmAmt">
     		<xsl:element  name="TtlIntrBkSttlmAmt">
     			<xsl:attribute name="Ccy">EUR</xsl:attribute>
     			<xsl:value-of select="//pain:IntrBkSttlmAmt"/>
     		</xsl:element>
     	</xsl:template>	
    </xsl:stylesheet>


    mais ça a effacé tous les namespaces y compris celui de la balise <Document>....


    Qui peut m'aider à me positionner pou épargner cette balise ?

  16. #16
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Exactement le code que j'ai dit (pas le tien, ça ne marchera pas,) mais en ajoutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02"
    dans <xsl:stylesheet>. Oui, c'est juste la même chose que xmlns:pain. xmlns:pain sert aux xpath, alors que xmlns tout court sert à créer les balises sans préfixe dans le bon namespace.

  17. #17
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    Impec !!!


    Pour conclure, voici le code du fichier 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?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="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:TtlIntrBkSttlmAmt">
     		<xsl:element  name="TtlIntrBkSttlmAmt">
     			<xsl:attribute name="Ccy">EUR</xsl:attribute>
     			<xsl:value-of select="//pain:IntrBkSttlmAmt"/>
     		</xsl:element> 
     	</xsl:template>	
     
    	<xsl:template match="pain:NbOfTxs">
     		<xsl:element  name="NbOfTxs">1</xsl:element> 
     	</xsl:template>	
     
    </xsl:stylesheet>

    Un grand merci à toi !!!!!

  18. #18
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Euh ? Ça ne devrait pas marcher, puisque tu continues à faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:element name="TtlIntrBkSttlmAmt">
      <xsl:attribute name="Ccy">EUR</xsl:attribute>
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TtlIntrBkSttlmAmt Ccy="EUR">
    Si ça marche quand même, ça doit être un bug dans le moteur XSLT que tu utilises.

  19. #19
    Membre du Club
    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
    Points : 45
    Points
    45
    Par défaut
    Si ça marche :

    Voilà ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TtlIntrBkSttlmAmt Ccy="EUR">20.00</TtlIntrBkSttlmAmt>
    en utilisant le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:template match="pain:TtlIntrBkSttlmAmt">
            <xsl:element  name="TtlIntrBkSttlmAmt">
     		<xsl:attribute name="Ccy">EUR</xsl:attribute>
     		<xsl:value-of select="//pain:IntrBkSttlmAmt"/>
     	</xsl:element>
    </xsl:template>

    Avec ta solution (mais j'ai dû oublié quelquechose par rapport au ns) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TtlIntrBkSttlmAmt xmlns:pain="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02" Ccy="EUR">20.00</TtlIntrBkSttlmAmt>
    avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="pain:TtlIntrBkSttlmAmt">
     	<TtlIntrBkSttlmAmt Ccy="EUR">
     		<xsl:value-of select="//pain:IntrBkSttlmAmt"></TtlIntrBkSttlmAmt>

  20. #20
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par anakin59490 Voir le message
    Si ça marche :

    Voilà ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TtlIntrBkSttlmAmt Ccy="EUR">20.00</TtlIntrBkSttlmAmt>
    en utilisant le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:template match="pain:TtlIntrBkSttlmAmt">
            <xsl:element  name="TtlIntrBkSttlmAmt">
     		<xsl:attribute name="Ccy">EUR</xsl:attribute>
     		<xsl:value-of select="//pain:IntrBkSttlmAmt"/>
     	</xsl:element>
    </xsl:template>
    Oui je te crois, mais ça devrait ne pas marcher. Si ça marche, il y a un bug dans le moteur XSLT que tu utilises.
    Là tu demandes à créer un élément sans namespace, pourtant dans le document généré, l'élément hérite du namespace par défaut.
    => Pas ce qui est demandé, donc bug du moteur XSLT.

    Citation Envoyé par anakin59490 Voir le message
    Avec ta solution (mais j'ai dû oublié quelquechose par rapport au ns) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TtlIntrBkSttlmAmt xmlns:pain="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.02" Ccy="EUR">20.00</TtlIntrBkSttlmAmt>
    avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="pain:TtlIntrBkSttlmAmt">
     	<TtlIntrBkSttlmAmt Ccy="EUR">
     		<xsl:value-of select="//pain:IntrBkSttlmAmt"></TtlIntrBkSttlmAmt>
    Ah, en effet. Du coup ma solution n'est pas la plus simple.

    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="pain:TtlIntrBkSttlmAmt">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:value-of select="//pain:IntrBkSttlmAmt"/>
      </xsl:copy>
    serait plus simple.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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, 20h32
  2. Valider un fichier XML avec un Schema
    Par Groove dans le forum Valider
    Réponses: 4
    Dernier message: 09/11/2005, 09h15
  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, 11h31
  4. Modification de fichier XML avec XSLT
    Par osmoz dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/07/2005, 12h04
  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, 15h13

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