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] XML -> XML filtré


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 20
    Points
    20
    Par défaut [XSLT] XML -> XML filtré
    Bonjour, bonsoir

    voila petit probleme de modification de mon fichier XML via ma feuille de style XSL

    mon but est de partir d'un fichier xml comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <livres>
            <BD nom="Mu" librairie="lib2" prix="20"/>
            <BD nom="La ballade de la mer salée" librairie="lib2" prix="15"/>
            <BD nom="Mu" librairie="lib1" prix="21"/>
            <roman nom="Les taupes" librairie="lib2" prix="16"/>
            <roman nom="Les gens de smiley" librairie="lib3" prix="11"/>
            <BD nom="Mu" librairie="lib3" prix="16"/>
            <roman nom="Les taupes" librairie="lib1" prix="19"/>
    </livres>
    et de generer le meme fichier XML mais seulement avec les libre dont le prix est le plus bas, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <livres>
            <BD nom="La ballade de la mer salée" librairie="lib2" prix="15"/>
            <roman nom="Les taupes" librairie="lib2" prix="16"/>
            <roman nom="Les gens de smiley" librairie="lib3" prix="11"/>
            <BD nom="Mu" librairie="lib3" prix="16"/>
    </livres>
    pour cela j'utilise la feuille de style suivante :
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" encoding="ISO-8859-1" />
     
            <xsl:template match="*">
                    <xsl:variable name="prix" select="@prix" />
                    <xsl:variable name="nom" select="@nom" />
                    <xsl:variable name="minprix" select="@prix"/>
                    <xsl:for-each select="*/@nom[name() = $nom]">
                             <xsl:if test="$prix &lt;= @prix"> <!-- &lt;= signifie inférieur  ou egal -->
                                  <xsl:variable name="minprix" select="@prix"/>
                             </xsl:if>
                    </xsl:for-each>
                    <xsl:if test="$prix &lt;= $minprix">
                            <xsl:copy>
                                 <xsl:apply-templates select="node()|@*"/>
                            </xsl:copy>
                    </xsl:if>
            </xsl:template>
     
    	<xsl:template match="text()">
    		<xsl:value-of select="."/>
    	</xsl:template>
     
    	<xsl:template match="@*">
    		<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
    	</xsl:template>
     
    </xsl:stylesheet>
    donc l'idée c de parcourir toute les balises ou le nom est le meme et d'afficher la balise seulement si son prix est le plus petit

    mais ca marche pas du tout, si quelqu'un a une idée ca m'aiderait pas mal (c'est meme peut etre une simple de syntaxe je suis pas tres bon en xsl :s)


    merci d'avance

  2. #2
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    Juste une suggestion...

    Il me semble que les variables en XSL s'écrivent ainsi :

    "{$var}" donc dans ton cas :

    {$var1} &lt {$var2} je pense...

    Bon courage pour la suite

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    hum non c'est pas ca, xsltproc ne me le prend pas

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    bon resolu, j'etais a coté de la plaque sur mon for-each qui descendais sur le noeud attribut

    donc le resultat :
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!-- commande : xsltproc change.xsl base.xml > result.xml -->
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" encoding="ISO-8859-1" />
     
            <xsl:template match="//*/*">
                    <xsl:variable name="prix" select="@prix" />
                    <xsl:variable name="type" select="name()" />
                    <xsl:variable name="nomlivre" select="@nom" />
                    <xsl:variable name="minprix">
                      <xsl:for-each select="//*[(name()= $type) and (@nom = $nomlivre)]">
                               <xsl:choose>
                                   <xsl:when test="$prix &lt;= @prix"> <!-- &lt;= signifie inférieur  ou egal -->
                                        <xsl:value-of select="@prix"/>
                                   </xsl:when>
                                   <xsl:otherwise>
                                        0
                                   </xsl:otherwise>
                               </xsl:choose>
                      </xsl:for-each>
                    </xsl:variable>
                    <xsl:if test="$prix &lt;= $minprix">
                            <xsl:copy>
                                 <xsl:apply-templates select="node()|@*"/>
                            </xsl:copy>
                    </xsl:if>
            </xsl:template>
     
    	<xsl:template match="text()">
    		<xsl:value-of select="."/>
    	</xsl:template>
     
    	<xsl:template match="@*">
    		<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
    	</xsl:template>
     
    </xsl:stylesheet>

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

Discussions similaires

  1. Executer une feuille XSLT sur du xml
    Par naiadeKaren dans le forum Général Python
    Réponses: 2
    Dernier message: 24/08/2005, 15h53
  2. [XML][XSLT] transformer le xml en binaire via une xslt
    Par chama dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/07/2005, 12h42
  3. [XSLT] xml plat à xml arborescent
    Par enigma dans le forum XSL/XSLT/XPATH
    Réponses: 24
    Dernier message: 24/06/2005, 23h43
  4. [XSLT] transformation XHTML->XML
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 23/05/2005, 14h15
  5. [XSLT] XML vers XML
    Par ren0 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/10/2004, 13h54

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