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 :

[XSLT] for-each et variables


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    Points : 69
    Points
    69
    Par défaut [XSLT] for-each et variables
    Bonjour,

    J ai des données stockées au format xml de type :
    CLIENT
    PRODUIT
    QUANTITE
    PRIX
    QUANTITE_BASE

    QUANTITE_BASE est identique pour toutes les données du couple CLIENT PRODUIT.

    Je dois dans un tableau créer une nouvelle donnée QUANTITE_DE_BASE et modifier QUANTITE en fonction de QUANTITE_BASE.

    En gros j ai ces données :
    CLIENT : C1
    PRODUIT : P1
    QUANTITE : 500
    PRIX : 5
    QUANTITE_BASE : 600

    CLIENT : C1
    PRODUIT : P1
    QUANTITE : 300
    PRIX : 6
    QUANTITE_BASE : 600 (idem que celui du dessus car mm couple client produit)

    CLIENT : C2
    PRODUIT : P1
    QUANTITE : 800
    PRIX : 3
    QUANTITE_BASE : 500
    -----
    Je dois obtenir un tableau avec
    CLIENT : C1
    PRODUIT : P1
    QUANTITE : 0
    PRIX : 5
    QUANTITE_DE_BASE : 500 (=QUANTITE car QUANTITE<QUANTITE_BASE, je dois garder en mémoire les 100 de la QUANTITE_BASE restant pour le prochain couple client/produit)

    CLIENT : C1
    PRODUIT : P1
    QUANTITE : 0 (car il y a des QUANTITE_BASErestant)
    PRIX : 6
    QUANTITE_DE_BASE : 100 (QUANTITE_BASErestant<QUANTITE dc on affiche 100 et on garde en mémoire les 200 que l on a pas encore affiché 300-100=QUANTITE-QUANTITE_BASErestant)

    CLIENT : C1
    PRODUIT : P1
    QUANTITE : 200 (la QUANTITE RESTANTE)
    PRIX : 6
    QUANTITE_DE_BASE : 0 (car il n y a plus de QUANTITE_BASErestant)
    --> pour ce couple on a bien une quantité totale de 500+300 mais répartie en 500 + 100 + 200
    Pour le couple suivant C2/P1:
    CLIENT : C2
    PRODUIT : P1
    QUANTITE : 0
    PRIX : 3
    QUANTITE_DE_BASE : 500

    CLIENT : C2
    PRODUIT : P1
    QUANTITE : 300
    PRIX : 3
    QUANTITE_DE_BASE : 0
    L'algo pour moi ne pose pas vraiment de pb ... Le seul hic c est les variables en xslt !!

    Il faudrait que j arrive à initialiser une variable avant mon for-each et que j arrive à la modifier dans ma boucle ... Sauf que j ai la valeur de ma quantite_base dans la boucle ...
    En plus, je crois qu il y a des souci avec les variables, des questions de noeuds en xslt.
    Je comprends pas trop comment m en sortir malgré les tuto et posts lus jusqu à maintenant !!!

    Voici ma boucle sans cette variable pour le moment :
    <x:for-each select="//NIVEAU1">
    <tr >
    <x:attribute name="class">r<x:value-of select="position() mod 2"/></x:attribute>
    <td ><x:value-of select="@CLIENT"/></td>
    <td ><x:value-of select="@PRODUIT"/></td>
    <td ><x:value-of select="@QUANTITE "/></td>
    <td ><x:value-of select="@PRIX"/></td>
    <td ><x:value-of select="@QUANTITE_DE_BASE"/></td>
    </tr>
    </x:for-each>

    En fait je vois comment déclarer une variable et l initialiser
    <x:variable nom="base">0</x:variable>
    mais comment lui affecter une valeur par la suite ?


    Merci d avance

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    En xslt les variables sont immutables, plus assimllable a des constantes
    http://xml.developpez.com/faq/?page=3#xslt_variable

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    Points : 69
    Points
    69
    Par défaut
    C est bien ce que j avais lu dc je me demandais comment faire !!!

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    Citation Envoyé par Mil17
    C est bien ce que j avais lu dc je me demandais comment faire !!!

    il me seble qu'il a repondu à ta question qui était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mais comment lui affecter une valeur par la suite ?
    si tu veux une autre reponse, pose une autre question

  5. #5
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    En xslt on evite les algo itératifs ont fait du recursif.
    Réecrit ton algo en recursif

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    Points : 69
    Points
    69
    Par défaut
    OKI je vais voir ce que je peux faire mais comme c est un peu complexe ...

    Bref, j ai une question encore !
    Voila, j ai écrit ce petit code ;
    <x:variable name="maValATester">a</x:variable>
    [un peu de code sans intéret]
    <x:if test="$maValATester='a'">
    <x:variable name="maValATester"><x:value-of select="@VALEUR"/></x:variable>
    </x:if>
    <x:value-of select="@VALEUR"/>
    <x:if test="$maValATester='N'">
    Je suis là
    </x:if>
    Mon souci c est que "je suis là" ne s'affiche pas alors que @VALEUR est bien égal à N.
    La preuve qd je fais <x:value-of select="@VALEUR"/> j'obtiends bien N ...
    Le souci c'est que maValATester garde 'a' comme valeur ! Et moi j ai du mal avec le récursif !!!

    Comment faire ?

  7. #7
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Pb de localité des variables voir

    http://erwy.developpez.com/cours/langage/xslt/variable/

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    Points : 69
    Points
    69
    Par défaut
    oui je sais ...
    J ai bien lu ce doc, mais je ne vois pas vraiment comment m en sortir.
    La récursivité je veux bien mais j'ai 5 à 6 conditions particulières qui donnent un affichage dans un tableau .. Bref, je ne pense pas m en sortir comme ça ...
    Ca veut dire que finalement j suis dans la panade c'est ça ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    Points : 69
    Points
    69
    Par défaut
    Bon et bien j ai cru comprendre qu il n y avait pas de solution ... Tantpis va falloir que je revois ma methode

    Merci qd même ...

  10. #10
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par Mil17
    Bon et bien j ai cru comprendre qu il n y avait pas de solution ...
    Si on te l'a dit je n'irais pas dire le contraire
    xml d'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
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="UTF-8"?>
    <liste>
    	<item>
    		<P>1</P>
    		<C>1</C>
    		<Q>400</Q>
    		<QB>800</QB>
    	</item>
    	<item>
    		<P>1</P>
    		<C>1</C>
    		<Q>300</Q>
    		<QB>800</QB>
    	</item>
    	<item>
    		<P>1</P>
    		<C>1</C>
    		<Q>300</Q>
    		<QB>800</QB>
    	</item>
    </liste>
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    <?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" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:template match="/">
    		<table>
    			<xsl:call-template name="DECREC">
    				<xsl:with-param name="lst" select="liste/item[P=1 and C=1]"/>
    				<xsl:with-param name="Qt" select="0"/>
    			</xsl:call-template>
    		</table>
    	</xsl:template>
    	<xsl:template name="DECREC">
    		<xsl:param name="lst"/>
    		<xsl:param name="Qt"/>
    		<xsl:if test="$lst[1]">
    			<xsl:variable name="QtCl">
    				<xsl:choose>
    					<xsl:when test="$lst[1]/QB &lt; ($Qt + $lst[1]/Q)">
    						<xsl:choose>
    							<xsl:when test="$lst[1]/QB &lt; $Qt">
    								<xsl:value-of select="0"/>
    							</xsl:when>
    							<xsl:otherwise>
    								<xsl:value-of select="$lst[1]/QB - $Qt"/>
    							</xsl:otherwise>
    						</xsl:choose>
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:value-of select="$lst[1]/Q"/>
    					</xsl:otherwise>
    				</xsl:choose>
    			</xsl:variable>
    			<l>
    				<P>
    					<xsl:value-of select="$lst[1]/P"/>
    				</P>
    				<C>
    					<xsl:value-of select="$lst[1]/C"/>
    				</C>
    				<Q>0</Q>
    				<QB>
    				<xsl:value-of select="number($QtCl)"/>					
    				</QB>
    			</l>
    			<xsl:choose>
    				<xsl:when test="$QtCl &lt; $lst[1]/Q">
    				<l>
    					<P>
    						<xsl:value-of select="$lst[1]/P"/>
    					</P>
    					<C>
    						<xsl:value-of select="$lst[1]/C"/>
    					</C>
    					<Q>
    						<xsl:value-of select=" $lst[1]/Q -  number($QtCl)"/>
    					</Q>
    					<QB>0</QB>
    				</l>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:call-template name="DECREC">
    						<xsl:with-param name="lst" select="$lst[position() &gt; 1]"/>
    						<xsl:with-param name="Qt" select="$Qt+$QtCl"/>
    					</xsl:call-template>
    				</xsl:otherwise>
    			</xsl:choose>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
    xml de sortie
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <table>
    	<l>
    		<P>1</P>
    		<C>1</C>
    		<Q>0</Q>
    		<QB>400</QB>
    	</l>
    	<l>
    		<P>1</P>
    		<C>1</C>
    		<Q>0</Q>
    		<QB>300</QB>
    	</l>
    	<l>
    		<P>1</P>
    		<C>1</C>
    		<Q>0</Q>
    		<QB>100</QB>
    	</l>
    	<l>
    		<P>1</P>
    		<C>1</C>
    		<Q>200</Q>
    		<QB>0</QB>
    	</l>
    </table>

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    Points : 69
    Points
    69
    Par défaut
    J'ai fini par utilisé la fonction "preceding-sibling" qui m'a permis, de façon récursive, de jouer avec mes valeurs précédentes pour un champ donné de ma table ...
    Tout fonctionne à présent parfaitement.
    Je remercie ceux qui ont tenté de me venir en aide et me permets ce petit message supplémentaire, qui aiguillera peut etre d'autres personnes dans la même panade que moi et leur permettra de perdre un peu moins de temps

    Encore merci

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

Discussions similaires

  1. [XSLT] PB: Boucle (for-each) et variable
    Par luchoo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/11/2010, 13h58
  2. [XSLT] For-each avec variable multidimensionelle
    Par pourloineus dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 05/08/2009, 10h04
  3. [XSL] for-each et variable
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 12/01/2006, 11h42
  4. [xslt] For-each dans template avec format XML (row)
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2005, 11h14
  5. [XSLT]for-each imbiqués
    Par Capt. Flame dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 24/10/2005, 12h57

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