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

XML/XSL et SOAP Discussion :

Combiner 2 fichiers XML en un seul avec XSLT


Sujet :

XML/XSL et SOAP

  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 Combiner 2 fichiers XML en un seul avec XSLT
    Bonjour,
    Avez-vous une méthode simple pour combiner deux fichiers XML ?
    Je cherche à faire l'équivalent d'un JOIN en SQL.

    Voici le premier fichier avec des factures (Numero de facture et montant). C'est le fichier Invoices.xml
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <Invoices>
    	<Invoice>
    		<InvNbr>12</InvNbr>
    		<InvAmount>120</InvAmount>
    	</Invoice>
    	<Invoice>
    		<InvNbr>13</InvNbr>
    		<InvAmount>130</InvAmount>
    	</Invoice>
    	<Invoice>
    		<InvNbr>14</InvNbr>
    		<InvAmount>140</InvAmount>
    	</Invoice>
    </Invoices>
    et voici le second fichier (Numéro de facture et monnaie). C'est le fichier Currencies.xml
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <Currencies>
    <Invoice>
    	<InvoiceNbr>12</InvoiceNbr>
    	<Curr>EUR</Curr>
    </Invoice>
    <Invoice>
    	<InvoiceNbr>13</InvoiceNbr>
    	<Curr>NOK</Curr>
    </Invoice>
    <Invoice>
    	<InvoiceNbr>14</InvoiceNbr>
    	<Curr>GBP</Curr>
    </Invoice>
    </Currencies>
    Vous remarquez le numéro de facture commun aux deux fichiers.
    Je désire obtenir un fichier XML reprenant toutes les données du premier fichier et la monnaie de la facture (balise <Curr>) provenant du second fichier. Comment puis-je obtenir 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
    <?xml version="1.0" encoding="UTF-8"?>
    <Invoices>
    	<Invoice>
    		<InvNbr>12</InvNbr>
    		<InvAmount>120</InvAmount>
    		<Curr>EUR</Curr>
    	</Invoice>
    	<Invoice>
    		<InvNbr>13</InvNbr>
    		<InvAmount>130</InvAmount>
    		<Curr>NOK</Curr>
    	</Invoice>
    	<Invoice>
    		<InvNbr>14</InvNbr>
    		<InvAmount>140</InvAmount>
    		<Curr>GBP</Curr>
    	</Invoice>
    </Invoices>
    Merci pour vos suggestions.

  2. #2
    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
    Une solution serait de copier le premier tel que, mais en modifiant la gestion des <Invoice> de sorte que pour chacun d'eux, on aille chercher dans le second document l'information manquante.

    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
    <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:template match="node()">
      <xsl:copy>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
     
    <xsl:template match="Invoice">
      <xsl:copy>
        <xsl:apply-templates/>
        <xsl:copy-of select="document('le-document.xml')/chemin/vers/Curr"/>
      </xsl:copy>
    </xsl:template>
     
    </xsl:transform>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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
    Oui, Merci, c'est ce que j'essaye de faire mais sans trop de succès.
    En mettant le chemin dans votre fichier comme 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
    <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="xml" indent="yes"/>
    <xsl:template match="node()">
      <xsl:copy>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
     
    <xsl:template match="Invoice">
      <xsl:copy>
        <xsl:apply-templates/>
        <xsl:copy-of select="document('Currencies.xml')/Invoice/InvoiceNbr/Curr"/>
      </xsl:copy>
    </xsl:template>
     
    </xsl:transform>
    j'obtiens une copie du fichier de départ mais sans la monnaie :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <Invoices>
    	<Invoice>
    		<InvNbr>12</InvNbr>
    		<InvAmount>120</InvAmount>
    	</Invoice>
    	<Invoice>
    		<InvNbr>13</InvNbr>
    		<InvAmount>130</InvAmount>
    	</Invoice>
    	<Invoice>
    		<InvNbr>14</InvNbr>
    		<InvAmount>140</InvAmount>
    	</Invoice>
    </Invoices>
    Comment puis-je faire comprendre à mon fichier 1 que pour <InvNbr>12</InvNbr> il doit trouver le <Curr> correspondant à <InvoiceNbr>12</InvoiceNbr> ?

    Merci pour votre aide. Elle m'aide à progresser.

  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
    Il suffit de l'indiquer dans le xpath :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoice[InvoiceNbr = 12]
    "Le <Invoice> dont le <InvoiceNbr> contient 12"

    Par contre, je te signale que tu as oublié /Invoices/
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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
    Formidable ! votre "/Invoice[InvoiceNbr = 13]/Curr" m'a mis sur la voie !

    Voici la solution que je suis parvenu à établir et qui fonctionne :
    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
    <?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" indent="yes"/>
    <!-- XSLT à appliquer sur Invoices.xml -->
     
    <xsl:template match="/*">
    	<Invoices>
    		<xsl:for-each select="Invoice">
    			<Invoice>
    				<xsl:copy-of select="./InvNbr"/>
    				<xsl:copy-of select="./InvAmount"/>
    				<!-- je definis une première variable fixée comme étant le numéro de facture -->
    					<xsl:variable name="Facture"><xsl:value-of select="./InvNbr"/></xsl:variable>
    					<!-- j utilise la premiere variable pour la definition de la seconde -->
    					<xsl:variable name="Monnaie">
    								<xsl:value-of select= "document('Currencies.xml')/Currencies/Invoice[InvoiceNbr=$Facture]/Curr"/>
    								<!-- ici j ai été obligé d'utiliser la variable $Facture parce que je ne parvenait pas à mettre à droite du signe = une référence xpath --> 
    					</xsl:variable>
     
    				<Currency>
    				<!-- utilisation de la variable -->
    				<xsl:value-of select="$Monnaie"/>
    				</Currency>
    			</Invoice>
    		</xsl:for-each>
    	</Invoices>
    </xsl:template>
    </xsl:stylesheet>
    Ce n'est pas une solution élégante mais ça marche.
    Quand j'aurai un peu plus d'experience XSLT, je ferai mieux j'espère.
    Merci beaucoup pour vos conseils et le temps que vous m'avez consacré. Vous m'avez vraiment permis de trouver une solution.

  6. #6
    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
    En l'occurrence je n'ai pas fait grand-chose.

    Des gens qui savent chercher par eux-mêmes la solution en essayant les informations qu'on leur donne, ça a l'air normal.
    Mais en réalité, on aimerait en voir plus souvent. Alors bravo à toi.
    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. Rassembler quatre fichiers xml dans un seul xml
    Par youba11 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 24/06/2008, 16h14
  2. [DTD] Valider mon fichier xml gràce à ma DTD avec DOM
    Par fonkyom dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 09/02/2008, 13h43
  3. Charger Fichiers XML dans une table avec SQL*LOADER
    Par devdev2003 dans le forum SQL
    Réponses: 2
    Dernier message: 14/01/2008, 10h40
  4. [XSLT] fichier.xml?tag=import récupérer avec get
    Par LeXo dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/10/2007, 14h28

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