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] Ne pas répêter attribut de même valeur ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [XSLT] Ne pas répêter attribut de même valeur ?
    Bonjour à tous !!!
    Je suis en train de faire un projet pour la fac , c'est un projet de géolocalisation .Je dois sélectionner des produits dans des listes déroulantes et que les produits s'affiche sur un plan ..
    J'ai donc mon xml qui se présente comme sa :

    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" ?>
    <?xml-stylesheet href="magasin.xsl" type="text/xsl" ?>
     
    <magasin>
     
    	<secteur nom="Cosmetologie" >
    		<rayon nom="Podologie">
    			<produit type="Creme" marque="Loreal" prix="5,50" x="295" y="180">  </produit>
    			<produit type="Creme" marque="YvesRocher" prix="4,25 " x="295" y="160"> </produit>
    			<produit type="Rabot" marque="LeRabot" prix="4,00 " x="295" y="200">  </produit>
    		</rayon>
    		<rayon nom="Soin du visage">
    			<produit type="Masque" marque="Loreal" prix="6,75 " x="282" y="180" >  </produit>
    			<produit type="Fond de teint" marque="Loreal" prix="5,75 " x="282" y="160">  </produit>
    			<produit type="Masque" marque="YvesRocher" prix="3.90 " x="282" y="200">  </produit>
    		</rayon>
    	</secteur>
    </magasin>
    (avec plusieurs secteur)
    et mon xsl :
    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
     
    <?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="html" encoding="ISO-8859-1" />
     
    <xsl:template match="/">
    	<html> 
     
    		<body style="background:url('plan.jpg');background-repeat:no-repeat; background-position: top right">
    		<center><font color="white"><h2>* * * Bienvenue dans votre hypermarche  * * *</h2></font><font color="#e00080"><i><h4>Service de localisation de vos produits</h4></i></font></center>
    			<form method="get" action="relais.php" target="maFrame">
    				<xsl:apply-templates select="//*" />
    				<!-- selection de tous les noeuds de l'arbre dom -->
    				<input type="submit" value="Rechercher" />
    				<input type="reset" value="Annuler" />
    			</form>
     
    		<br/><br/><br/><br/><br/><br/><br/><br/><br/>
    		<center><iframe width="850" height="600" name="maFrame" frameborder="0"></iframe></center>
     
    		</body>
    	</html>
    </xsl:template>
     
    <xsl:template match="*[not(preceding::*[name()=name(current())])]">
     
    	<b><u><font color="black"><xsl:value-of select="name()" /></font></u></b> 
    	<table>
    		<xsl:apply-templates select="@*" />
    	</table>
     
     
    </xsl:template>
     
    <xsl:template match="@*">
     
    	<xsl:variable name="baliseParente" select="name(..)" />
    	<xsl:variable name="nomAttribut" select="name()" />
    	<td>
    		<tr bgcolor="#ffe0a0">
    			<font color="#e00080"><xsl:value-of select="$nomAttribut" /></font>
     
    			<select name="{concat($baliseParente,'-',$nomAttribut)}">
    				<option value="">-- Tous --</option>
    				<xsl:for-each select="//*[name()=$baliseParente]/@*[name()=$nomAttribut]">
    					<option>
    						<xsl:value-of select="."/>
    					</option>
    				</xsl:for-each>
    			</select>
    		<br/>
    		</tr>
    	</td>
     
    </xsl:template>
     
     
     
     
    </xsl:stylesheet>

    Mais dans mes liste de produits par exemple j'ai deux fois la valeur"creme" alors que j'aimerais qu'elle ne saffiche q'une fois ...
    Est ce que qu'elqu'un sais ce que je dois faire pour regler ce petit pb??

    Merci à tous d'avance
    Bonne journée
    Emilie

  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

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je suis aller voir , mais en fait c'est pas exactement ce que je veux , car il faut que dans mon XSL il n'y ait pas de valeur et que ca soit générique ..

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Comme ma feuille XSL doit être générique je ne peux pas appliquer cela ...

    <xsl:template match="*[not(preceding::*[name()=name(current())])]">
    C'est un truc dans ce genre la "expression régulière" qu'il me faut pour gerer le fait que les attributs de même nom ne doivent pas avoir la même valeur...
    Cette expression régulière là , évite qu'il y ait une liste produit pour chaque balise produit..
    Il me faudrait un peu dans ce style mais pour vérifier que les valeurs des attribut soit la premiere rencontrés , si on la deja vu , on la mets pas ..
    Je sais pas si j'ai été très claire...
    Bisous à tous

  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
    le mecanisme de clé sur lequel est basé la méthode de regroupement que je t'ai montré n'est pas forcement sur la valeur, il peut l'être sur n'importe quel critère: nom, position, parent, fils.... voir une combinaison de ces facteurs.
    le mieux serait que tu montres la sortie que tu désires (parce que le moins qu'on puisse dire c'est que les explications ne sont pas très clair) avant que tu ne t'egares encore + sur de fausses pistes...(déjà que j'ai l'impression qu'il y a une sacré confusion netre les attributs et les balises.... )

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Désolé pour les explications pas claires ..
    Voici une capture d'écran pour éclairer un petit peu tout ça



    Vous voyez , il y a deux fois Creme , trois fois Fromage et ce que je souhaiterais c'est d'avoir qu'une seule fois la la valeur .
    J'ai par exemple
    <produit type="Creme" marque="Loreal" prix="5,50" x="295" y="180"> </produit>
    <produit type="Creme" marque="YvesRocher" prix="4,25 " x="295" y="160"></produit>
    dans mon Xml et ej soihaiter que la valeur Creme ne s'affiche qu'une seule fois dans ma liste déroulante..
    Voilà j'espère que je me suis mieu expliqué cette fois ..
    Biz

  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
    M'ouais
    Bon, pas sur que ça reponde à la question , mais ca fait un tri generique:

    soit un xml d'entree du type
    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
     
     
    <magasin>
    	<secteur nom="Cosmetologie">
    		<rayon nom="Podologie">
    			<produit type="Creme" marque="Loreal" prix="5,50" x="295" y="180">  </produit>
    			<produit type="bidule" marque="YvesRocher" prix="4,25 " x="295" y="160"> </produit>
    		</rayon>
    	</secteur>
    	<secteur nom="Cosmetologie">
    		<rayon nom="Podologie">
    			<produit type="Creme" marque="Loreal" prix="5,50" x="295" y="180">  </produit>
    			<produit type="Creme" marque="YvesRocher" prix="4,25 " x="295" y="160"> </produit>
    			<produit type="Rabot" marque="LeRabot" prix="4,00 " x="295" y="200">  </produit>
    		</rayon>
    		<rayon nom="Podologie">
    			<produit type="Creme" marque="Loreal" prix="5,50" x="295" y="180">  </produit>
    			<produit type="truc" marque="LeRabot" prix="4,00 " x="295" y="200">  </produit>
    		</rayon>
    		<rayon nom="Soin du visage">
    			<produit type="Masque" marque="Loreal" prix="6,75 " x="282" y="180">  </produit>
    			<produit type="Fond de teint" marque="Loreal" prix="5,75 " x="282" y="160">  </produit>
    			<produit type="Masque" marque="YvesRocher" prix="3.90 " x="282" y="200">  </produit>
    		</rayon>
    	</secteur>
    </magasin>
    l'algo de tri
    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
    <?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:key name="cle" match="*" use="concat(name(),'/',@type|@nom)"/>
    	<xsl:template match="/magasin">
    		<magasin>
    			<xsl:apply-templates select="current()//*[generate-id(.)=generate-id(key('cle',concat(name(),'/',@type|@nom))[1])]">
    				<xsl:sort select="name()"/>
    			</xsl:apply-templates>
    		</magasin>
    	</xsl:template>
    	<xsl:template match="*">
    		<xsl:copy>
    		<xsl:attribute name="nom"><xsl:value-of select="@type|@nom"></xsl:value-of></xsl:attribute>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>
    le resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <magasin>
    	<produit nom="Creme"/>
    	<produit nom="bidule"/>
    	<produit nom="Rabot"/>
    	<produit nom="truc"/>
    	<produit nom="Masque"/>
    	<produit nom="Fond de teint"/>
    	<rayon nom="Podologie"/>
    	<rayon nom="Soin du visage"/>
    	<secteur nom="Cosmetologie"/>
    </magasin>

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    c'est presque ça , mais tu vois dans le XSL , tu utilise le snom de balise de mon XML et j'ai pas le droit , il faut que ca soit générique .Genre si quelqu'un met son propre xml avec des nom de balise differentes , mon xsl doit pouvoir s'adapter...

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/06/2007, 07h45
  2. [XSLT] Création d'un filtre selon la valeur d'un attribut
    Par lemok dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/05/2007, 17h13
  3. Problème avec un cookie: je ne retrouve pas la même valeur
    Par metalcoyote dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 15/02/2007, 15h10
  4. [XSLT][HTML] Afficher un attribut et plusieurs valeurs ?
    Par Najla dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 05/11/2006, 16h32
  5. [XSLT]Sort sur un attribut dont la valeur est en param
    Par Trin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 07/11/2005, 16h16

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