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] recopier et Insérer un nouvel attribut après calcul


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] recopier et Insérer un nouvel attribut après calcul
    Bonjour,
    Voici mes données :
    <BLOC ETAPE="1" PRODUIT="P1" QTE_COMMANDEE="5" PRIX="10"/>
    <BLOC ETAPE="1" PRODUIT="P2" QTE_COMMANDEE="8" PRIX="8"/>

    J'aimerai copier mon XML mais en même temps rajouter une colonne TOTAL telle que TOTAL=QTE_COMMANDE*PRIX (j ai simplifié le truc pour avoir l idée générale ... En vrai mes calculs sont plus complexes dc je suis obligé de passer par une variable intermediaire)
    Et donc avoir :

    <BLOC ETAPE="1" PRODUIT="P1" QTE_COMMANDEE="5" PRIX="10" TOTAL="50"/>
    <BLOC ETAPE="1" PRODUIT="P2" QTE_COMMANDEE="8" PRIX="8" TOTAL="64"/>

    Voici ce que je fais :
    <x:template match="*">
    <x:copy-of select="."/>
    </x:template>
    <x:template match="@*|comment()|text()">
    <x:copy/>
    </x:template>

    <x:template match="BLOC">
    <x:for-each select="@*">
    <x:variable name="qte" select="@QTE_COMMANDEE"/>
    <x:variable name="prix" select="@PRIX"/>
    <x:variable name="total"><x:value-of select="$qte * $prix"></x:variable>

    <x:copy>
    <x:attribute name="TOTAL">$total</x:attribute>
    </x:copy>
    </x:for-each>
    </x:template>
    Mais ça ne marche pas ...
    Mes données précédentes sont bien copiées mais j ai pas mes nouveaux attributs !

  2. #2
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    si j'ai bien compris tu veux copié un fichier xml en ajoutant pour la balise bloc un attribut total
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output 
      		encoding="ISO-8859-15"
      		method="xml"
      		indent="yes" />
     
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="BLOC">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
          <xsl:attribute name="TOTAL"><xsl:value-of select="@PRIX * @QTE_COMMANDEE"/></xsl:attribute>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>

  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
    T as bien compris mais ça ne fonctionne pas mieux ... Aucun attribut n est ajouté !

    D ailleurs moi en plus, j ai besoin de mettre des variables car j ai des calculs super compliqués.

  4. #4
    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
    Maintenant je fais :
    <x:template match="*">
    <x:copy-of select="."/>
    </x:template>
    <x:template match="@*|comment()|text()">
    <x:copy/>
    </x:template>

    <x:template match="BLOC">
    <x:variable name="qte" select="@QTE_COMMANDEE"/>
    <x:variable name="prix" select="@PRIX"/>
    <x:variable name="total"><x:value-of select="$qte * $prix"></x:variable>
    <x:copy>
    <x:attribute name="TOTAL">$total</x:attribute>
    </x:copy>
    </x:template>
    Mais ça ne fonctionne pas non plus.

  5. #5
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    Si j'ai pas bien compris il va falloir me ré expliquer.
    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <x:attribute name="TOTAL">$total</x:attribute>
    est faux il faut essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <x:attribute name="TOTAL"><xsl:value-of select="$total"/></x:attribute>
    ou mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:attribute name="TOTAL"><xsl:value-of select="@PRIX * @QTE_COMMANDEE"/></xsl:attribute>
    sinon avec mon xsl, le fichier xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <racine>
    <BLOC ETAPE="1" PRODUIT="P1" QTE_COMMANDEE="5" PRIX="10"/>
    <BLOC ETAPE="1" PRODUIT="P2" QTE_COMMANDEE="8" PRIX="8"/>
    </racine>
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <racine>
    <BLOC ETAPE="1" PRODUIT="P1" QTE_COMMANDEE="5" PRIX="10" TOTAL="50"/>
    <BLOC ETAPE="1" PRODUIT="P2" QTE_COMMANDEE="8" PRIX="8" TOTAL="64"/>
    </racine>

  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
    En fait c est le début qui empêchait que ça fonctionne correctement.
    Il fallait écrire

    <x:template match="node()">
    <x:copy><x:apply-templates select="@*|node()|comment()"/></x:copy>
    </x:template>
    <x:template match="text()|@*|comment()">
    <x:copy/>
    </x:template>
    A priori étant donné l'arbo de mon XML il faut utiliser node()

    Merci de ton aide !

    @+

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

Discussions similaires

  1. [XSLT]Recopie de document XML
    Par khamkham dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/04/2010, 14h16
  2. [XSLT] Recopier l'ensemble des attributs et leur valeur
    Par gandalflemaia dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 21/11/2009, 18h09
  3. Nouvelle fenetre aprés clique sur bouton
    Par Bikra dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 25/03/2008, 13h45
  4. [XSLT]recopie XML avec ajout attribut
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 25/07/2006, 00h39
  5. [Débutant] Nouvelle attribution de valeur ??
    Par BBoys85 dans le forum Access
    Réponses: 9
    Dernier message: 27/06/2006, 15h03

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