Problème lecture des noeuds dans xslt

Problème lecture des noeuds dans xslt - XML/XSL - Programmation

Marsh Posté le 20-11-2008 à 15:18:58    

Bonjour,
 
Voici le fichier que je lis :
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<factures>
    <entete>
        <nbrEntete>101</nbrEntete>
        <numclientEnt>115207</numclientEnt>
        <numDocumentEnt>800756839</numDocumentEnt>
        <typeDocEnt>F</typeDocEnt>
        <dateFactureEnt>01102008</dateFactureEnt>
        <echeanceFactureEnt>05102008</echeanceFactureEnt>
        <resteABlancEnt/>
    </entete>
    <ligne>
        <nbrDetail>201</nbrDetail>
        <numClient>115207</numClient>
        <numAvenant>481463</numAvenant>
        <numimmatric>108AVG</numimmatric>
        <nomConduct/>
        <structure/>
        <codeGenre>VP</codeGenre>
        <refExtClient>524</refExtClient>
        <codeProduit>LLOY</codeProduit>
        <libelleProduit>Loyer financier</libelleProduit>
        <montantHT>488,98</montantHT>
        <montantTVA>95,84</montantTVA>
        <montantTTC>584,82</montantTTC>
        <codeDevise>EUR</codeDevise>
        <tauxTVA>19,60</tauxTVA>
        <dateDebPresta>01102008</dateDebPresta>
        <dateFinPresta>31102008</dateFinPresta>
        <resteABlanc/>
    </ligne>
    <ligne>
        <nbrDetail>201</nbrDetail>
        <numClient>115207</numClient>
        <numAvenant>481463</numAvenant>
        <numimmatric>108AVG</numimmatric>
        <nomConduct/>
        <structure/>
        <codeGenre>VP</codeGenre>
        <refExtClient>524</refExtClient>
        <codeProduit>LMAIASS</codeProduit>
        <libelleProduit>Maintenance &amp; Assistance</libelleProduit>
        <montantHT>103,26</montantHT>
        <montantTVA>20,24</montantTVA>
        <montantTTC>123,50</montantTTC>
        <codeDevise>EUR</codeDevise>
        <tauxTVA>19,60</tauxTVA>
        <dateDebPresta>01102008</dateDebPresta>
        <dateFinPresta>31102008</dateFinPresta>
        <resteABlanc/>
    </ligne>
    <pied>
        <nbrPied>301</nbrPied>
        <numclientPied>115207</numclientPied>
        <numDocumentPied>800756839</numDocumentPied>
        <typeDocPied>F</typeDocPied>
        <dateFacturePied>01102008</dateFacturePied>
        <montantHTPied>726,39</montantHTPied>
        <montantTVAPied>136,83</montantTVAPied>
        <montantTTCPied>863,22</montantTTCPied>
        <codeDevisePied>EUR</codeDevisePied>
        <resteABlancPied/>
    </pied>
        <entete>
        <nbrEntete>101</nbrEntete>
        <numclientEnt>334229</numclientEnt>
        <numDocumentEnt>800757637</numDocumentEnt>
        <typeDocEnt>F</typeDocEnt>
        <dateFactureEnt>01102008</dateFactureEnt>
        <echeanceFactureEnt>01112008</echeanceFactureEnt>
        <resteABlancEnt/>
    </entete>
    <ligne>
        <nbrDetail>201</nbrDetail>
        <numClient>334229</numClient>
        <numAvenant>517270</numAvenant>
        <numimmatric>401AXK</numimmatric>
        <nomConduct>ANNE SOPHIE</nomConduct>
        <structure/>
        <codeGenre>VP</codeGenre>
        <refExtClient>149</refExtClient>
        <codeProduit>LLOY</codeProduit>
        <libelleProduit>Loyer financier</libelleProduit>
        <montantHT>438,59</montantHT>
        <montantTVA>85,96</montantTVA>
        <montantTTC>524,55</montantTTC>
        <codeDevise>EUR</codeDevise>
        <tauxTVA>19,60</tauxTVA>
        <dateDebPresta>01102008</dateDebPresta>
        <dateFinPresta>31102008</dateFinPresta>
        <resteABlanc/>
    </ligne>
    <ligne>
        <nbrDetail>201</nbrDetail>
        <numClient>334229</numClient>
        <numAvenant>517270</numAvenant>
        <numimmatric>401AXK</numimmatric>
        <nomConduct>ANNE SOPHIE</nomConduct>
        <structure/>
        <codeGenre>VP</codeGenre>
        <refExtClient>149</refExtClient>
        <codeProduit>LMAIASS</codeProduit>
        <libelleProduit>Maintenance &amp; Assistance</libelleProduit>
        <montantHT>67,41</montantHT>
        <montantTVA>13,21</montantTVA>
        <montantTTC>80,62</montantTTC>
        <codeDevise>EUR</codeDevise>
        <tauxTVA>19,60</tauxTVA>
        <dateDebPresta>01102008</dateDebPresta>
        <dateFinPresta>31102008</dateFinPresta>
        <resteABlanc/>
    </ligne>
    <pied>
        <nbrPied>301</nbrPied>
        <numclientPied>334229</numclientPied>
        <numDocumentPied>800757637</numDocumentPied>
        <typeDocPied>F</typeDocPied>
        <dateFacturePied>01102008</dateFacturePied>
        <montantHTPied>638,17</montantHTPied>
        <montantTVAPied>119,53</montantTVAPied>
        <montantTTCPied>757,70</montantTTCPied>
        <codeDevisePied>EUR</codeDevisePied>
        <resteABlancPied/>
    </pied>
</factures>
 
 
voici mon xslt :
 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns0="http://127.0.0.1:880/" xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension" xmlns:saxon="http://saxon.sf.net/" xmlns:XQMessageElem="http://www.sonicsw.com/sonicxq/com.sonicsw.xq.service.xform.TransformationElementFactory" extension-element-prefixes="XQMessageElem" xmlns:str="http://BI.EU.FR.REI.nullcompensation" exclude-result-prefixes="str xs saxon XQHeaderFunc xs tns0">
    <xsl:output method="xml" encoding="iso-8859-1" indent="yes"/>
    <xsl:template match="/">  
        <xsl:for-each select="/factures">
            <Factures>
                <xsl:for-each select="entete">
                <Record>
                    <CODE_FOUR>52035</CODE_FOUR>
                    <FACT_FOU>
                        <xsl:value-of select="numDocumentEnt"/>
                    </FACT_FOU>
                    <DATE_FAFO>
                        <xsl:value-of select="dateFactureEnt"/>
                    </DATE_FAFO>
                     <xsl:for-each select="../pied">
                    <DEVISE>
                        <xsl:value-of select="codeDevisePied"/>
                    </DEVISE>
                    <TOTAL_HT>
                        <xsl:value-of select="montantHTPied"/>
                    </TOTAL_HT>
                    <TOTAL_TTC>
                        <xsl:value-of select="montantTTCPied"/>
                    </TOTAL_TTC>
                    </xsl:for-each>
                    <DTAE_ECH>
                        <xsl:value-of select="echeanceFactureEnt"/>
                    </DTAE_ECH>
                    <MODE_REG>
                    </MODE_REG>
                    <CODE_STE>10</CODE_STE>
                    <TYPE>
                        <xsl:choose>
                            <xsl:when test="typeDocEnt = 'F'">FAC</xsl:when>
                            <xsl:otherwise>AV</xsl:otherwise>
                        </xsl:choose>
                    </TYPE>
                    <Liste_Cdes>
                        <Commande>
                            <NUM_CDE>
                            </NUM_CDE>
                            <REFIMPCDE>
                            </REFIMPCDE>
                            <Lignes_Facture>
                                <xsl:for-each select="../ligne">
                                    <Ligne>
                                        <REF_ART>
                                            <xsl:value-of select="codeProduit"/>
                                        </REF_ART>
                                        <MONTANT>
                                            <xsl:value-of select="montantHT"/>
                                        </MONTANT>
                                        <TAUX_TVA>
                                            <xsl:value-of select="tauxTVA"/>
                                        </TAUX_TVA>
                                        <PU_REMISE>
                                            <xsl:value-of select="montantHT"/>
                                        </PU_REMISE>
                                        <QUANTITE>1</QUANTITE>
                                        <DESIGNAT>
                                            <xsl:value-of select="libelleProduit"/>
                                        </DESIGNAT>
                                        <NUM_LIG>
                                            <xsl:value-of select="position()"/>
                                        </NUM_LIG>
                                    </Ligne>
                                </xsl:for-each>
                            </Lignes_Facture>
                        </Commande>
                    </Liste_Cdes>
                </Record>
                </xsl:for-each>
            </Factures>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
 
 
 
Et voici ce que je souhaiterais obtenir  
 
<?xml version="1.0" encoding="iso-8859-1"?>
<Factures>
    <Record>
        <CODE_FOUR>52035</CODE_FOUR>
        <FACT_FOU>800756839</FACT_FOU>
        <DATE_FAFO>01102008</DATE_FAFO>
        <DEVISE>EUR</DEVISE>
        <TOTAL_HT>726,39</TOTAL_HT>
        <TOTAL_TTC>863,22</TOTAL_TTC>
        <DTAE_ECH>05102008</DTAE_ECH>
        <MODE_REG/>
        <CODE_STE>10</CODE_STE>
        <TYPE>FAC</TYPE>
        <Liste_Cdes>
            <Commande>
                <NUM_CDE/>
                <REFIMPCDE/>
                <Lignes_Facture>
                    <Ligne>
                        <REF_ART>LLOY</REF_ART>
                        <MONTANT>488,98</MONTANT>
                        <TAUX_TVA>19,60</TAUX_TVA>
                        <PU_REMISE>488,98</PU_REMISE>
                        <QUANTITE>1</QUANTITE>
                        <DESIGNAT>Loyer financier</DESIGNAT>
                        <NUM_LIG>1</NUM_LIG>
                    </Ligne>
                    <Ligne>
                        <REF_ART>LMAIASS</REF_ART>
                        <MONTANT>103,26</MONTANT>
                        <TAUX_TVA>19,60</TAUX_TVA>
                        <PU_REMISE>103,26</PU_REMISE>
                        <QUANTITE>1</QUANTITE>
                        <DESIGNAT>Maintenance &amp; Assistance</DESIGNAT>
                        <NUM_LIG>2</NUM_LIG>
                    </Ligne>
                </Lignes_Facture>
            </Commande>
        </Liste_Cdes>
    </Record>
    <Record>
        <CODE_FOUR>52035</CODE_FOUR>
        <FACT_FOU>800757637</FACT_FOU>
        <DATE_FAFO>01102008</DATE_FAFO>
        <DEVISE>EUR</DEVISE>
        <TOTAL_HT>638,17</TOTAL_HT>
        <TOTAL_TTC>757,70</TOTAL_TTC>
        <DTAE_ECH>01112008</DTAE_ECH>
        <MODE_REG/>
        <CODE_STE>10</CODE_STE>
        <TYPE>FAC</TYPE>
        <Liste_Cdes>
            <Commande>
                <NUM_CDE/>
                <REFIMPCDE/>
                <Lignes_Facture>
                    <Ligne>
                        <REF_ART>LLOY</REF_ART>
                        <MONTANT>438,59</MONTANT>
                        <TAUX_TVA>19,60</TAUX_TVA>
                        <PU_REMISE>438,59</PU_REMISE>
                        <QUANTITE>1</QUANTITE>
                        <DESIGNAT>Loyer financier</DESIGNAT>
                        <NUM_LIG>8</NUM_LIG>
                    </Ligne>
                    <Ligne>
                        <REF_ART>LMAIASS</REF_ART>
                        <MONTANT>67,41</MONTANT>
                        <TAUX_TVA>19,60</TAUX_TVA>
                        <PU_REMISE>67,41</PU_REMISE>
                        <QUANTITE>1</QUANTITE>
                        <DESIGNAT>Maintenance &amp; Assistance</DESIGNAT>
                        <NUM_LIG>9</NUM_LIG>
                    </Ligne>
                </Lignes_Facture>
            </Commande>
        </Liste_Cdes>
    </Record>
</Factures>
 
Merci de votre aide ...

Reply

Marsh Posté le 20-11-2008 à 15:18:58   

Reply

Marsh Posté le 26-11-2008 à 14:19:35    

Qu'est-ce qui va pas?

Reply

Marsh Posté le 26-11-2008 à 19:51:14    

Bonsoir avander,
 
Et merci de t'interresser à mon problème ... j'avais quelques difficultées pour les boucles de lecture des noeuds mais j'y suis parvenu.
Par contre je ne parviens pas à cumuler les lignes sur certains critères ... voici le fichier :
 
<?xml version="1.0" encoding="utf-8" ?>  
- <Factures xmlns="urn:edeveloper.Factures">
- <Record>
  <CODE_FOUR>52035</CODE_FOUR>  
  <FACT_FOU>800756839</FACT_FOU>  
  <DATE_FAFO>01102008</DATE_FAFO>  
  <DEVISE>EUR</DEVISE>  
  <TOTAL_HT>726.39</TOTAL_HT>  
  <TOTAL_TTC>863.22</TOTAL_TTC>  
  <DTAE_ECH>05102008</DTAE_ECH>  
  <MODE_REG />  
  <CODE_STE>10</CODE_STE>  
  <TYPE>FAC</TYPE>  
- <Liste_Cdes>
- <Commande>
  <NUM_CDE>524</NUM_CDE>  
  <REFIMPCDE />  
- <Lignes_Facture>
- <Ligne>
  <REF_ART>LLOY</REF_ART>  
  <MONTANT>488.98</MONTANT>  
  <TAUX_TVA>19.60</TAUX_TVA>  
  <PU_REMISE>488.98</PU_REMISE>  
  <QUANTITE>1</QUANTITE>  
  <DESIGNAT>Loyer financier</DESIGNAT>  
  <NUM_LIG>1</NUM_LIG>  
  </Ligne>
- <Ligne>
  <REF_ART>LMAIASS</REF_ART>  
  <MONTANT>103.26</MONTANT>  
  <TAUX_TVA>19.60</TAUX_TVA>  
  <PU_REMISE>103.26</PU_REMISE>  
  <QUANTITE>1</QUANTITE>  
  <DESIGNAT>Maintenance - Assistance</DESIGNAT>  
  <NUM_LIG>2</NUM_LIG>  
  </Ligne>
- <Ligne>
  <REF_ART>LPNE</REF_ART>  
  <MONTANT>62.08</MONTANT>  
  <TAUX_TVA>19.60</TAUX_TVA>  
  <PU_REMISE>62.08</PU_REMISE>  
  <QUANTITE>1</QUANTITE>  
  <DESIGNAT>Pneumatiques</DESIGNAT>  
  <NUM_LIG>3</NUM_LIG>  
  </Ligne>
- <Ligne>
  <REF_ART>LVER</REF_ART>  
  <MONTANT>6.44</MONTANT>  
  <TAUX_TVA>19.60</TAUX_TVA>  
  <PU_REMISE>6.44</PU_REMISE>  
  <QUANTITE>1</QUANTITE>  
  <DESIGNAT>Vehicule de remplacement</DESIGNAT>  
  <NUM_LIG>4</NUM_LIG>  
  </Ligne>
- <Ligne>
  <REF_ART>LCAR</REF_ART>  
  <MONTANT>1.52</MONTANT>  
  <TAUX_TVA>19.60</TAUX_TVA>  
  <PU_REMISE>1.52</PU_REMISE>  
  <QUANTITE>1</QUANTITE>  
  <DESIGNAT>Gestion carburant</DESIGNAT>  
  <NUM_LIG>5</NUM_LIG>  
  </Ligne>
- <Ligne>
  <REF_ART>LARSK</REF_ART>  
  <MONTANT>28.30</MONTANT>  
  <TAUX_TVA>0.00</TAUX_TVA>  
  <PU_REMISE>28.30</PU_REMISE>  
  <QUANTITE>1</QUANTITE>  
  <DESIGNAT>Assurance Autorisk</DESIGNAT>  
  <NUM_LIG>6</NUM_LIG>  
  </Ligne>
- <Ligne>
  <REF_ART>LSRSK</REF_ART>  
  <MONTANT>35.81</MONTANT>  
  <TAUX_TVA>19.60</TAUX_TVA>  
  <PU_REMISE>35.81</PU_REMISE>  
  <QUANTITE>1</QUANTITE>  
  <DESIGNAT>Service Autorisk</DESIGNAT>  
  <NUM_LIG>7</NUM_LIG>  
  </Ligne>
  </Lignes_Facture>
  </Commande>
  </Liste_Cdes>
  </Record>
  </Factures>
 
Comment puis je faire pour cumuler les zones MONTANT et PU_REMISE des lignes qui aurait la zone REF_ART égale à 'LLOY' ou 'LSRSK' et la zone TAUX_TVA identique.
 
Merci d'avance
 

Reply

Marsh Posté le 27-11-2008 à 12:37:19    

As-tu regarde la fonction xpath sum()?
 

<xsl:template match="/">
   <xsl:value-of select='sum(//a)'/>
</xsl:template>


 
Exemple simpliste qui additionne le contenu de tous les éléments 'a' d'un arbre xml.  
Reste plus qu'à pondre un xpath de la mort qui tue...  :whistle:


Message édité par avander le 27-11-2008 à 12:38:51
Reply

Marsh Posté le 27-11-2008 à 14:18:50    

OK, je vais essayer et je te tiens au courant

Reply

Marsh Posté le 02-12-2008 à 17:20:10    

Bonsoir avander,
 
J'ai été capable de cumuler les lignes grace à la fonction sum() mais sans expression conditionnelle.
Voici le fichier xslt :
 
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" extension-element-prefixes="XQMessageElem" exclude-result-prefixes="str xs saxon XQHeaderFunc tns0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns0="http://127.0.0.1:880/" xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension" xmlns:saxon="http://saxon.sf.net/" xmlns:XQMessageElem="http://www.sonicsw.com/sonicxq/com.sonicsw.xq.service.xform.TransformationElementFactory" xmlns:str="http://BI.EU.FR.REI.nullcompensation">
    <xsl:output method="xml" encoding="iso-8859-1" indent="yes"/>
    <xsl:template match="/">
        <xsl:for-each select="/Factures">
            <Factures>
                <xsl:for-each select="Record">
                    <Record>
                        <CODE_FOUR><xsl:value-of select="CODE_FOUR"/></CODE_FOUR>
                        <FACT_FOU><xsl:value-of select="FACT_FOU"/></FACT_FOU>
                        <DATE_FAFO><xsl:value-of select="DATE_FAFO"/></DATE_FAFO>
                        <DEVISE><xsl:value-of select="DEVISE"/></DEVISE>
                        <TOTAL_HT><xsl:value-of select="TOTAL_HT"/></TOTAL_HT>
                        <TOTAL_TTC><xsl:value-of select="TOTAL_TTC"/></TOTAL_TTC>
                        <DTAE_ECH><xsl:value-of select="DTAE_ECH"/></DTAE_ECH>
                        <MODE_REG><xsl:value-of select="MODE_REG"/></MODE_REG>
                        <CODE_STE><xsl:value-of select="CODE_STE"/></CODE_STE>
                        <TYPE><xsl:value-of select="TYPE"/></TYPE>
                        <xsl:for-each select="Liste_Cdes">
                            <Liste_Cdes>
                                <xsl:for-each select="Commande">
                                    <Commande>
                                        <NUM_CDE><xsl:value-of select="NUM_CDE"/></NUM_CDE>
                                        <REFIMPCDE><xsl:value-of select="REFIMPCDE"/></REFIMPCDE>
                                        <xsl:for-each select="Lignes_Facture">
                                            <Lignes_Facture>
                                                    <Ligne>
                                                        <REF_ART>
                                                            <xsl:value-of select="''"/>
                                      </REF_ART>
                                   <MONTANT>
                                       <xsl:value-of select="format-number(number((sum(../Lignes_Facture/Ligne/MONTANT)*100) div 100),'0000000.00')"/>
                                   </MONTANT>
                                   <TAUX_TVA>
                                       <xsl:value-of select="'0'"/>
                                      </TAUX_TVA>
                    <PU_REMISE>
                        <xsl:value-of select="format-number(number((sum(../Lignes_Facture/Ligne/PU_REMISE)*100) div 100),'0000000.00')"/>
                    </PU_REMISE>
                    <QUANTITE>
                        <xsl:value-of select="'1'"/>
                                      </QUANTITE>
                    <DESIGNAT>
                        <xsl:value-of select="'Loyer Financier'"/>
                                      </DESIGNAT>
                    <NUM_LIG><xsl:value-of select="position()"/></NUM_LIG>
                                                    </Ligne>
                                            </Lignes_Facture>
                                        </xsl:for-each>
                                    </Commande>
                                </xsl:for-each>
                            </Liste_Cdes>
                        </xsl:for-each>
                    </Record>
                </xsl:for-each>
            </Factures>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
 
Sais tu si il est possible de cumuler une seule des rubrique d'un même noeud et de conditionner en plus ce cumul ? Si oui Comment ???

Reply

Marsh Posté le 03-12-2008 à 12:46:31    

J'ai pas trouvé le moyen de cumuler les deux éléments d'une ligne d'un coup... dans ces cas là il faut diviser pour règner et donc le faire en deux fois... mais je déséspère pas de trouver.
 


<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
<!-- general settings -->
  <xsl:output method="text" omit-xml-declaration="no" encoding="ISO-8859-1"/>
 
<!-- parameters -->
 
<!-- global variables -->
 
<!-- transformations -->
 
  <xsl:template match="/">
    <xsl:text>Start XSLT
    </xsl:text>
    <xsl:apply-templates select="//Lignes_Facture" />
  </xsl:template>
 
 
  <xsl:template match="Lignes_Facture">
    <xsl:text>Start Lignes Facture
    </xsl:text>
 
    <xsl:apply-templates select="Ligne[REF_ART = 'LLOY' or REF_ART = 'LSRSK']/MONTANT" />
    <xsl:apply-templates select="Ligne[REF_ART = 'LLOY' or REF_ART = 'LSRSK']/PU_REMISE" />
 
    <xsl:variable name="vMontantTotal" select="sum( Ligne[REF_ART = 'LLOY' or REF_ART = 'LSRSK']/MONTANT)" />
    <xsl:text>Montant Total: </xsl:text><xsl:value-of select="$vMontantTotal" /><xsl:text>
    </xsl:text>
 
    <xsl:variable name="vRemiseTotale" select="sum( Ligne[REF_ART = 'LLOY' or REF_ART = 'LSRSK']/PU_REMISE)" />
    <xsl:text>Remise Total: </xsl:text><xsl:value-of select="$vRemiseTotale" /><xsl:text>
    </xsl:text>
 
    <xsl:text>Total Total: </xsl:text><xsl:value-of select="$vMontantTotal + $vRemiseTotale" /><xsl:text>
    </xsl:text>
 
  </xsl:template>
 
 
  <xsl:template match="Ligne">
    <xsl:text>Start Ligne: </xsl:text><xsl:value-of select="DESIGNAT" /><xsl:text>
    </xsl:text>
    <xsl:value-of select="MONTANT" /><xsl:text>
    </xsl:text>
    <xsl:value-of select="TAUX_TVA" /><xsl:text>
    </xsl:text>
    <xsl:value-of select="PU_REMISE" /><xsl:text>
    </xsl:text>
  </xsl:template>
 
  <xsl:template match="MONTANT | PU_REMISE">
    [<xsl:value-of select="name()" />] <xsl:value-of select="." /><xsl:text>
    </xsl:text>
  </xsl:template>
 
 
</xsl:stylesheet>
<!-- eof -->


 
Ce qui me donne en sortie:
 


Start XSLT
    Start Lignes Facture
     
    [MONTANT] 488.98
     
    [MONTANT] 35.81
     
    [PU_REMISE] 488.98
     
    [PU_REMISE] 35.81
    Montant Total: 524.79
    Remise Total: 524.79
    Total Total: 1049.58


 
Voila de quoi t'inspirer...  :whistle:

Reply

Marsh Posté le 04-12-2008 à 12:48:35    

Bonjour Avander,
 
Ok je vasi essayer d'appliquer ta solution mais je ne maitrise pas très bine l'utilisation des template ...
 
Parce que j'ai d'ailleurs une autre difficulté pour laquelle la solution doit être l'utilsation d'un template ...
Je t'explique, j'ai ajouter au fichier de Factures xml un nouveau noeud ou j'ai une 30aine de fils dessous et je dois récupérer parmi les fils la valeur de l'attribut  correspondant à ma balise REF_ART voici ci-dessous un morceau di fichier et ce que j'ai essayer d'implementer dans le xslt :
 
le fichier xml en entrée
 
<?xml version="1.0" encoding="UTF-8"?>
<Factures>
    <Record>
        <CODE_FOUR>52035</CODE_FOUR>
        <FACT_FOU>800756860</FACT_FOU>
        <DATE_FAFO>01102008</DATE_FAFO>
        <DEVISE>EUR</DEVISE>
        <TOTAL_HT>-18788.45</TOTAL_HT>
        <TOTAL_TTC>-18788.45</TOTAL_TTC>
        <DTAE_ECH>05102008</DTAE_ECH>
        <MODE_REG/>
        <CODE_STE>10</CODE_STE>
        <TYPE>AV</TYPE>
        <Liste_Cdes>
            <Commande>
                <NUM_CDE>566</NUM_CDE>
                <REFIMPCDE>0</REFIMPCDE>
                <Lignes_Facture>
                    <Ligne>
                        <REF_ART>LOYER</REF_ART>
                        <MONTANT>-0001630.10</MONTANT>
                        <TAUX_TVA>0</TAUX_TVA>
                        <PU_REMISE>-0001630.10</PU_REMISE>
                        <QUANTITE>0</QUANTITE>
                        <DESIGNAT>Loyer Financier</DESIGNAT>
                        <NUM_LIG>1</NUM_LIG>
                    </Ligne>
                </Lignes_Facture>
            </Commande>
            <Commande>
                <NUM_CDE>529</NUM_CDE>
                <REFIMPCDE>0</REFIMPCDE>
                <Lignes_Facture>
                    <Ligne>
                        <REF_ART>LOYER</REF_ART>
                        <MONTANT>-0007192.25</MONTANT>
                        <TAUX_TVA>0</TAUX_TVA>
                        <PU_REMISE>-0007192.25</PU_REMISE>
                        <QUANTITE>0</QUANTITE>
                        <DESIGNAT>Loyer Financier</DESIGNAT>
                        <NUM_LIG>1</NUM_LIG>
                    </Ligne>
                </Lignes_Facture>
            </Commande>
        </Liste_Cdes>
    </Record>
    <db:result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:db="http://www.sonicsw.com/esb/service/dbservice" xsi:schemaLocation="http://www.sonicsw.com/esb/service/dbservice sonicfs:///System/Schemas/esb/service/DBService.xsd">
        <db:resultSet version="1.1">
            <db:row>
                <YARG>LOYER</YARG>
                <YLAL1>Loyer Financier               </YLAL1>
                <YNUM1>4501.00000</YNUM1>
            </db:row>
            <db:row>
                <YARG>PE001</YARG>
                <YLAL1>Conso.Diesel (Etranger)       </YLAL1>
                <YNUM1>1303000.00000</YNUM1>
            </db:row>
            <db:row>
                <YARG>PE002</YARG>
                <YLAL1>Conso.Essence (Etranger)      </YLAL1>
                <YNUM1>1304000.00000</YNUM1>
            </db:row>
        </db:resultSet>
    </db:result>
</Factures>
 
 
Et voilà mon xslt
 
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" extension-element-prefixes="XQMessageElem" exclude-result-prefixes="str xs saxon XQHeaderFunc tns0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:db="http://www.sonicsw.com/esb/service/dbservice" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns0="http://127.0.0.1:880/" xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension" xmlns:saxon="http://saxon.sf.net/" xmlns:XQMessageElem="http://www.sonicsw.com/sonicxq/com.sonicsw.xq.service.xform.TransformationElementFactory" xmlns:str="http://BI.EU.FR.REI.nullcompensation">
    <xsl:output method="xml" encoding="iso-8859-1" indent="yes"/>
    <xsl:template match="/">
        <xsl:for-each select="/Factures">
            <Factures>
                <xsl:for-each select="Record">
                    <Record>
                        <CODE_FOUR>
                            <xsl:value-of select="CODE_FOUR"/>
                        </CODE_FOUR>
                        <FACT_FOU>
                            <xsl:value-of select="FACT_FOU"/>
                        </FACT_FOU>
                        <DATE_FAFO>
                            <xsl:value-of select="DATE_FAFO"/>
                        </DATE_FAFO>
                        <DEVISE>
                            <xsl:value-of select="DEVISE"/>
                        </DEVISE>
                        <TOTAL_HT>
                            <xsl:value-of select="TOTAL_HT"/>
                        </TOTAL_HT>
                        <TOTAL_TTC>
                            <xsl:value-of select="TOTAL_TTC"/>
                        </TOTAL_TTC>
                        <DTAE_ECH>
                            <xsl:value-of select="DTAE_ECH"/>
                        </DTAE_ECH>
                        <MODE_REG>
                            <xsl:value-of select="MODE_REG"/>
                        </MODE_REG>
                        <CODE_STE>
                            <xsl:value-of select="CODE_STE"/>
                        </CODE_STE>
                        <TYPE>
                            <xsl:value-of select="TYPE"/>
                        </TYPE>
                        <xsl:for-each select="Liste_Cdes">
                            <Liste_Cdes>
                                <xsl:for-each select="Commande">
                                    <Commande>
                                        <NUM_CDE>
                                            <xsl:value-of select="NUM_CDE"/>
                                        </NUM_CDE>
                                        <REFIMPCDE>
                                            <xsl:value-of select="REFIMPCDE"/>
                                        </REFIMPCDE>
                                        <xsl:for-each select="Lignes_Facture">
                                            <Lignes_Facture>
                                                <xsl:for-each select="Ligne">
                                                    <Ligne>
                                                        <REF_ART>
                                                            <xsl:call-template name="RecupPCK">
                                                                <xsl:with-param name="REF_ARTvalue" select="REF_ART"></xsl:with-param>
                                                                <xsl:with-param name="PCKvalue" select="0"></xsl:with-param>
                                                            </xsl:call-template>
                                                            <xsl:choose>
                                        <xsl:when test="PCKvalue != 0">
                                            <xsl:value-of select="PCKvalue"/>
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:value-of select="REF_ART"/>
                                        </xsl:otherwise>
                                    </xsl:choose>
              </REF_ART>
                                                        <MONTANT>
                                                            <xsl:value-of select="MONTANT"/>
                                                        </MONTANT>
                                                        <TAUX_TVA>
                                                            <xsl:value-of select="TAUX_TVA"/>
                                                        </TAUX_TVA>
                                                        <PU_REMISE>
                                                            <xsl:value-of select="PU_REMISE"/>
                                                        </PU_REMISE>
                                                        <QUANTITE>
                                                            <xsl:value-of select="QUANTITE"/>
                                                        </QUANTITE>
                                                        <DESIGNAT>
                                                            <xsl:value-of select="DESIGNAT"/>
                                                        </DESIGNAT>
                                                        <NUM_LIG>
                                                            <xsl:value-of select="NUM_LIG"/>
                                                        </NUM_LIG>
                                                    </Ligne>
                                                </xsl:for-each>
                                            </Lignes_Facture>
                                        </xsl:for-each>
                                    </Commande>
                                </xsl:for-each>
                            </Liste_Cdes>
                        </xsl:for-each>
                    </Record>
                </xsl:for-each>
            </Factures>
        </xsl:for-each>
    </xsl:template>
    <xsl:template name="RecupPCK">
        <xsl:param name="REF_ARTvalue"></xsl:param>
        <xsl:param name="PCKvalue"></xsl:param>
        <xsl:for-each select="./ancestor::Factures/db:result/db:resultSet/db:row">
         <xsl:if test="YARG = $REF_ARTvalue">
             <xsl:param name="PCKvalue">
                 <xsl:value-of select="round(YNUM1)"/>
                </xsl:param>
         </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
 
 
Donc comment récupérer la valeur de YNUM1 par lme parametre du template ???
Merci de ton aide
 
 
 
 
 
 

Reply

Marsh Posté le 04-12-2008 à 15:41:07    

Oui va falloir étudier un peu le méchanisme d'une transformation parce jusqu'à présent tu ne t'en sert pas du tout...  
 
Mon exemple utilise ce méchanisme, c'est le principe de toute transformation. C'est pas compliqué il suffit de repérer les textes qui figurent dans le résultat et de regarder d'où il viennent.  
 
Autre problème, tu ne pourra pas récupérer la valeur du paramètre en sortie comme tu l'espère... les variables sont immuables en XSLT, tu ne peux que leur attribuer une valeur et ce à la création.


Message édité par avander le 04-12-2008 à 15:47:16
Reply

Marsh Posté le 04-12-2008 à 16:46:36    

Avec templates ça donne :

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet  
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
 xmlns:db="http://www.sonicsw.com/esb/service/dbservice"
 version="1.0">
 
<!-- general settings -->
  <xsl:output method="xml" omit-xml-declaration="no" encoding="ISO-8859-1"/>
 
<!-- parameters -->
 
<!-- global variables -->
 
<!-- transformations -->
 
  <xsl:template match="/">
    <xsl:text>Start XSLT
    </xsl:text>
    <xsl:apply-templates  />
  </xsl:template>
 
  <xsl:template match="*">
    <xsl:copy><!-- recopie l'element courant -->
      <xsl:apply-templates  />
    </xsl:copy>
  </xsl:template>
 
  <xsl:template match="REF_ART">
    <xsl:variable name="vRef" select="." />
    <xsl:variable name="vRow" select="//db:row[YARG = $vRef]" />
    <xsl:copy>
      <xsl:value-of select="$vRow/YNUM1" />
    </xsl:copy>
  </xsl:template>
 
  <xsl:template match="db:result">
   <xsl:comment>Je mange db:result!</xsl:comment>
  </xsl:template>
 
</xsl:stylesheet>
<!-- eof -->


 
et le résultat

<?xml version="1.0" encoding="ISO-8859-1"?>Start XSLT
    <Factures>
    <Record>
        <CODE_FOUR>52035</CODE_FOUR>
        <FACT_FOU>800756860</FACT_FOU>
        <DATE_FAFO>01102008</DATE_FAFO>
        <DEVISE>EUR</DEVISE>
        <TOTAL_HT>-18788.45</TOTAL_HT>
        <TOTAL_TTC>-18788.45</TOTAL_TTC>
        <DTAE_ECH>05102008</DTAE_ECH>
        <MODE_REG></MODE_REG>
        <CODE_STE>10</CODE_STE>
        <TYPE>AV</TYPE>
        <Liste_Cdes>
            <Commande>
                <NUM_CDE>566</NUM_CDE>
                <REFIMPCDE>0</REFIMPCDE>
                <Lignes_Facture>
                    <Ligne>
                        <REF_ART>4501.00000</REF_ART>
                        <MONTANT>-0001630.10</MONTANT>
                        <TAUX_TVA>0</TAUX_TVA>
                        <PU_REMISE>-0001630.10</PU_REMISE>
                        <QUANTITE>0</QUANTITE>
                        <DESIGNAT>Loyer Financier</DESIGNAT>
                        <NUM_LIG>1</NUM_LIG>
                    </Ligne>
                </Lignes_Facture>
            </Commande>
            <Commande>
                <NUM_CDE>529</NUM_CDE>
                <REFIMPCDE>0</REFIMPCDE>
                <Lignes_Facture>
                    <Ligne>
                        <REF_ART>4501.00000</REF_ART>
                        <MONTANT>-0007192.25</MONTANT>
                        <TAUX_TVA>0</TAUX_TVA>
                        <PU_REMISE>-0007192.25</PU_REMISE>
                        <QUANTITE>0</QUANTITE>
                        <DESIGNAT>Loyer Financier</DESIGNAT>
                        <NUM_LIG>1</NUM_LIG>
                    </Ligne>
                </Lignes_Facture>
            </Commande>
        </Liste_Cdes>
    </Record>
    <!--Je mange db:result!-->
</Factures>


 
Note qu'en utilisant le méchanisme de transfo y reste plus grand chose à faire dans le stylesheet...  :whistle:


Message édité par avander le 04-12-2008 à 16:48:15
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed