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 :

Xsl problème d'affichage (code) [débutant] [FAQ]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Par défaut Xsl problème d'affichage (code) [débutant]
    Bonjour,

    Je viens de commencer a apprendre un peu le xsl et ca fait depuis 2 jours que je coince sur un truc a la con que jarrive vraiment pas à résoudre

    Lorsque je tappe ca il m'affiche ce que je veux le problème c'est qu'il affiche tt les attributs de la balise "jeux" à la suite alors que je voudrais qu'il revienne à la ligne à chaque nouvelle balise "jeux"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <xsl:template match="/racine">
     
    	<xsl:for-each select="console">
     
    	<H2><center><xsl:value-of select="./Nom"/></center></H2>
    	<H1><center><xsl:value-of select="./Concepteur"/> : sortie le <xsl:value-of select="./DatedeSortie"/></center></H1>
     <li><xsl:apply-templates select="Jeux" /></li>
    </xsl:for-each>
    	</xsl:template>
    	</xsl:stylesheet>

    Et lorsque j'emboite 2 for each l'un sur l'autre le 2ème for each ne m'affiche rien
    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
    	<xsl:for-each select="racine/console">
     
    	<H2><center><xsl:value-of select="./Nom"/></center></H2>
    	<H1><center><xsl:value-of select="./Concepteur"/> : sortie le <xsl:value-of select="./DatedeSortie"/></center></H1>
    	</xsl:for-each>
     
    	   	<xsl:for-each select="/jeux">
    	   	<UL><xsl:value-of select="./titre" />
    	   <xsl:value-of select="./editeur" />
    	   <xsl:value-of select="./genre" />
    	    <xsl:value-of select="./datedesortie" /></UL>
    		</xsl:for-each>
    	<br />
     
    	</xsl:template>
    Donc si quelqu'un voit comment il faux que je m'y prenne, je vous remercie d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 33
    Par défaut
    Pour ton premier code, le mieux serait que tu crées un template pour l'élément jeux. Ainsi tu pourais le formater comme voulu.

    Pour le second code, le problème vient du for-each qui est en select="/jeux" Ce qui veut dire que tu cherches à récupérer le tag jeux racine.
    Je pense que tu voulais dire : select="./jeux" ce qui équivaut à select="jeux"

    Bon courage

  3. #3
    Membre Expert
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Par défaut
    Salut,

    Pour ton premier code, le mieux serait que tu crées un template pour l'élément jeux. Ainsi tu pourais le formater comme voulu.
    A mon avis il faudrait être un peu plus explicite et lui dire que si il fait un appel comme celui ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="Jeux" />
    Ce sont les règle par défaut qui s'applique (règle de xml) c'est à dire un value-of de chaque élément ce qui fait qu'il sont a la suite l'un de l'autre.

    Donc pour après afficher comme tu veux faut que tu fasse un autre template en dehors du premier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="Jeux">
    ce que tu veux afficher pour chaque occurence jeux
    </xsl:template>
    Il n'y a pas de différence avec le for-each si ce n'est que le for-each ce passe dans le même template.

    Et que si le parseur est msXML il faut préféré apply-template
    et si c'est xalan un for-each!

    ++

    Thierry

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Par défaut
    Pour la première solution en fait quoi que je mette dans le for each j'ai même essayé de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="*">
    et essayer de l'afficher avec ts ce qui était possible mais niet :/

    Et quand je crée le template en dehors pour la 2ème solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	<xsl:template match="Jeux">
     <li><xsl:value-of select="./titre" />
         <xsl:value-of select="./editeur" />
          <xsl:value-of select="./genre" />
           <xsl:value-of select="./datedesortie" /></li>
    </xsl:template>
    Il m'affiche bien le nombre exact de puce avec le (<li>) mais je n'ai aucune occurence d'affichée avec ou sans le "./" de même qu quand je mets <xsl:template match="/racine/console/Jeux">.

    Et quand je tappe ca <xsl:template match="/console/Jeux"> il ne m'affiche pas les puces et me le met en page à la suite comme avant

    Et j'utilise Sablotron comme parseur...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 33
    Par défaut
    Citation Envoyé par virgul
    Il n'y a pas de différence avec le for-each si ce n'est que le for-each ce passe dans le même template.

    Et que si le parseur est msXML il faut préféré apply-template
    et si c'est xalan un for-each!
    C'est curieux : tu remarques avec justesse mon manque de précision concernant ma réponse et tu avances une affirmation (qui me parait fausse) sans aucune explication

    xsl:for-each n'est pas du tout équivalent à xsl:apply-templates : le premier est une boucle alors que le second réapplique tous les templates existants ce qui est plus souple (on évite les xsl:choose) et permet la surcharge (en utilisant xsl:import).

    De plus, pourquoi tu différencies xalan et msXML ? et qu'est-ce qui te fait dire qu'il faut préférer xsl:for-each à xsl:apply-templates ?

    sans animosité...

  6. #6
    Membre Expert
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Par défaut
    xsl:for-each n'est pas du tout équivalent à xsl:apply-templates : le premier est une boucle alors que le second réapplique tous les templates existants ce qui est plus souple (on évite les xsl:choose) et permet la surcharge (en utilisant xsl:import).

    C'est vrai tu as tout à fait raison mais je ne voulais pas trop entré dans les détails vu que la personne est débutante en lui expliquant un truc quelle ne pourra surement pas totalement comprendre ce qui est normal biensur

    Pour le for-each et le apply-template, c'est vrai! je l'ai lu sur un site puis j'ai posé une question sur un forum et une autre personne me l'a confirmé et il n'avait pas la même source! Ce qui me permet de dire ca.
    Je sais pas comment te l'expliquer car moi même lors de la lecture de l'article je n'ai pas vraiment compris.
    désolé je t'aurais bien donné la source mais je l'ai perdu

    De plus, pourquoi tu différencies xalan et msXML ?
    Sa n'est quand même pas été écrit dans le même language (un a la microsoft et l'autre en JAVA) donc il peux y avoir des différences de performance

    Mais c'est vrai que la il peux y avoir incertitude de ta part :


    sans animosité non plus

  7. #7
    Membre Expert
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Par défaut
    Il m'affiche bien le nombre exact de puce avec le (<li>) mais je n'ai aucune occurence d'affichée avec ou sans le "./" de même qu quand je mets <xsl:template match="/racine/console/Jeux">.
    pour afficher un attribut @lenomdelattribut pas ./ mais ca ne lui empêche pas de faire toute les occurence de jeux et pour chaque de mettre un li

  8. #8
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par abubu
    xsl:for-each n'est pas du tout équivalent à xsl:apply-templates : le premier est une boucle alors que le second réapplique tous les templates existants ce qui est plus souple (on évite les xsl:choose) et permet la surcharge (en utilisant xsl:import).
    Il existe deux modes majeurs de programmation XSLT, le mode push et le mode pull.

    Dans le mode push, ou l'on utilise abondamment <xsl:apply-templates> sans attribut select, le déroulement du programme suit la structure de la source XML. Les templates sont appelés dans l'ordre d'apparition des noeuds du flux XML auxquels ils correspondent. En l'absence de template dédié, ce sont les templates par défaut qui sont utilisés. Cette méthode a l'avantage de pouvoir s'adapter facilement à des modifications du schéma XML (et de rendre possible la surcharge des templates, comme tu l'as précisé).

    Dans le mode pull, le développeur influe sur le déroulement du programme en sélectionnant l'ordre de traitement des noeuds de la source XML. Il utilise pour cela des <xsl:apply-templates> avec un attribut select renseigné, ou des <xsl:for-each>. Il est préférable dans ce mode d'utiliser les <xsl:for-each>, car les performances sont meilleures (pas de "pattern matching" nécessaire à la sélection des templates).

    Dans la plupart des feuilles de styles, quel que soit le domaine, les deux modes sont utilisés.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Par défaut
    Raa je suis dsl mais ca marche tjs pas c'est bien comme ca qu'il faut l'écrire?
    <xsl:value-of select="@titre" />

    Sinon voila mon xml c'est pt de la que ca vient :/
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet href="listejeux.css" type="text/css"?>
    <racine>
     <console>
         <Nom>Dreamcast</Nom>
         <Concepteur>SEGA</Concepteur>
         <DatedeSortie>28 Novembre 1998</DatedeSortie>
    	 	 <Jeux> 
    	        <Titre>Shenmue</Titre>
    		 <Editeur>Sega</Editeur>
    		 <Genre>Action/Aventure</Genre>
    		 <DatedeSortieJ>29 Decembre 1999</DatedeSortieJ>
    		 </Jeux>
    		 <Jeux> 
    	     <Titre>Sonic</Titre>
    		 <Editeur>Sega</Editeur>
    		 <Genre>Plate-form</Genre>
    		 <DatedeSortieJ>28 Decembre 1998</DatedeSortieJ>
    		 </Jeux>
       </console>
       <console>
         <Nom>Playstation</Nom>
         <Concepteur>SONY</Concepteur>
         <DatedeSortie>09 Octobre 2000</DatedeSortie>
    	 	 <Jeux> 
    	     <Titre>Kessen</Titre>
    		 <Editeur>Koei</Editeur>
    		 <Genre>Strategie</Genre>
    		 <DatedeSortieJ>29 Decembre 2001</DatedeSortieJ>
    		 </Jeux>
       </console>
    </racine>
    ou alors du début de mon xsl :/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output 
      method="html"
      encoding="ISO-8859-1"
      doctype-public="-//W3C//DTD HTML 4.01//EN"
      doctype-system="http://www.w3.org/TR/html4/strict.dtd"
      indent="yes" />

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 33
    Par défaut
    Citation Envoyé par GrandFather
    Il existe deux modes majeurs de programmation XSLT, le mode push et le mode pull.
    Merci, j'aurai appris quelque chose aujourd'hui

  11. #11
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par redsaint
    Raa je suis dsl mais ca marche tjs pas c'est bien comme ca qu'il faut l'écrire?
    <xsl:value-of select="@titre" />
    Non. XML est sensible à la casse, donc "titre" n'est pas équivalent à "Titre". D'autre part, @ est un alias pour l'axe XPath attribute, et sert donc à sélectionner un attribut. Dans ton cas, <Titre> est un élément, pas un attribut.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  12. #12
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Par défaut
    Ah ouais c'est bon je saurais à l'avenir que ce language est super sensible, je suis dsl de vous avoir fait perdre du temps pr ca en ts cas merci bcp...

  13. #13
    Membre Expert
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Par défaut
    Ok ben content de l'apprendre moi je croiais que c'étais une bonne idée de faire des apply-template avec un select suivi d'une condition...


    Vu que j'utilise MSXML!!!


    Merci de nous faire partager ta science GrandFather ca fait toujours plaisir de se coucher moins con que quand on s'est levé!


    ++

    Thierry


    P.S. redsaint pense au bouton résolu! Merci

  14. #14
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par virgul
    Ok ben content de l'apprendre moi je croiais que c'étais une bonne idée de faire des apply-template avec un select suivi d'une condition...
    Ce n'est pas faux, mais ce n'est peut-être pas toujours la meilleure façon.
    Ce que je n'ai pas précisé, c'est que le seul véritable intérêt qu'on ait à utiliser <xsl:apply-templates> plutôt que <xsl:for-each> en mode pull, c'est quand on doit factoriser un traitement (qu'on place alors dans un template), ou qu'on l'utilise avec l'attribut mode (qui n'existe pas, et pour cause, pour <xsl:for-each>).
    Citation Envoyé par virgul
    Vu que j'utilise MSXML!!!
    Je ne pense pas que ce processeur soit plus adapté pour fonctionner dans un mode plutôt qu'un autre...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/02/2014, 11h29
  2. [XSL]Probléme d'affichage avec @
    Par gwendo dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 14/05/2007, 09h56
  3. [XML/CSS/XSL] Problème d'affichage des images "dynamiqu
    Par popol55 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 06/04/2006, 16h24
  4. [Débutant][JScrollePane] Problème d'affichage
    Par flzox dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 12/12/2004, 16h36

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