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 :

[xml/xsl] Problème de noeuds et attributs


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [xml/xsl] Problème de noeuds et attributs
    Bonjour à tous d'un petit nouveau

    J'ai un problème sur lequel je planche depuis 4 jours et pour lequel je n'ai toujours pas trouvé de solution.
    Bon c'est un problème de débutant que je souhaitais résoudre tout seul dans mon coin mais j'ai vraiment du mal!

    J'ai la dtd suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!ELEMENT enseignement (matiere*,etudiant)> 
    <!ELEMENT matiere (libelle)>
    <!ATTLIST matiere ident ID #REQUIRED
                responsable IDREF #IMPLIED>
    <!ELEMENT libelle (#PCDATA)>
     
    <!ELEMENT etudiant(nom*,prenom*,note)>
    <!ATTLIST etudiant ident ID #REQUIRED>
    <!ElEMENT nom (#PCDATA)>
    <!ELEMENT prenom (#PCDATA)>
    <!ELEMENT note (#PCDATA)>
    <!ATTLIST note ident ID #REQUIRED
    		 matiere IDREF #IMPLIED>
    Je souhaite récupérer le min et le max des notes concernant chaque matière. Il m'a donc semblé judicieux décrire dans un fichier xsl les requêtes suivantes :

    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
    <xsl:for-each select="enseignement/matiere">
     
    		<xsl:variable name="mat" select="@ident"/>
     
    		<xsl:value-of select="libelle"/>
     
    		<xsl:for-each select="../etudiant/note[@matiere=$mat]">
    				<xsl:sort select="."/>
     
    				<xsl:if test="position()=1"> Note maximale : <xsl:value-of select="."/></xsl:if>
     
    			</xsl:for-each>
     
     
    			<xsl:for-each select="../etudiant/note[@matiere=$mat]">
    				<xsl:sort select="." order="descending"/>
     
    				<xsl:if test="position()=1"> Note minimale : <xsl:value-of select="."/></xsl:if>
     
    			</xsl:for-each>
     
    		</xsl:for-each>
    Hélas ça ne marche pas du tout, et j'ai vraiment tout tenté ! Il semblerait que mon xsl:sort ne me donne pas les notes d'une même matières dans un ordre croissant (ou décroissant quand je le demande d'ailleurs).
    Voilà, si parmis vous quelqu'un a perçoit mon problème, je lui serais éternellemnt reconnaissant

  2. #2
    Expert éminent
    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
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    le problème est que position() renvoie la position de la note dans la liste sélectionnée par le for-each, pas dans la liste triée.

    Il est préférable d'utiliser une fonction récursive :
    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
    <xsl:template name="note-maximum">
      <xsl:param name="matiere"/>
      <xsl:param name="note-max" select="0"/>
      <xsl:param name="index" select="1"/>
      <xsl:variable name="note" select="../etudiant/note[@matiere = $matiere][$index]"/>
      <xsl:choose>
        <xsl:when test="$note">
          <xsl:call-template name="note-maximum">
            <xsl:with-param name="matiere" select="$matiere"/>
            <xsl:with-param name="note-max">
             <xsl:choose>
               <xsl:when test="$note &gt; $note-max">
                 <xsl:value-of select="$note"/>
               </xsl:when>
               <xsl:otherwise>
                 <xsl:value-of select="$note-max">
               </xsl:otherwise>
              </xsl:choose>
            </xsl:with-param>
            <xsl:with-param name="index" select="$index + 1"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$note-max"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    ...
    <xsl:for-each select="enseignement/matiere">
      ...
      Note maximale : 
      <xsl:call-template name="note-maximum">
        <xsl:with-param name="matiere" select="@ident"/>
      </xsl:call-template>
      ...
    </xsl:for-each>
    Je te laisse écrire la fonction note-minimum.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Houlà : Merci beaucoup !!
    Va falloir que j'étudie tout ça dans le détail pace que en tant que grand débutant, je n'ai pas encore regardé comment fonctionne les templates exactement.

    Mais j'ai une question subsidiaire en fait
    Aprés affichage des valeurs du noeud note aprés traitement par xsl:sort, il commence par me les afficher dans l'ordre puis aprés ça se gate...ça viendrait aussi du for-each ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je pense avoir compris l'idée (donc faut oublier ma question précédente ) mais j'aurais une dernière question qui du coup reste sans solution.
    Lorsqu'on ramène une liste de chiffres que l'on a placé dans une variable temp par exemple. Lorsqu'on l'affiche avec

    <xsl:select= "$temp"/>
    et qu'à l'exécution, cela nous sort une suite de chiffres du style :

    15 16 3 9 17

    Comme faire pour afficher seulement le premier chiffre, en l'occurence 15 ici?
    Est-ce possible ?

  5. #5
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

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

    oui tout à fait substring est la pour ca:

    http://www.w3schools.com/xpath/xpath_functions.asp#string


    ++

    Thierry

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Voilà ! Grâce à votre aide j'ai pu venir à bout de mes requêtes.
    Tout fonctionne à merveille.
    Merci beaucoup

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

Discussions similaires

  1. XML XSL problème
    Par bad_andressito dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/05/2013, 17h39
  2. Réponses: 4
    Dernier message: 16/07/2006, 15h00
  3. [XML/XSL]problème avec for-each
    Par mavina dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/06/2006, 16h28
  4. [XSL]Problème affiche noeuds non traités
    Par tomsawyer dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 27/06/2006, 17h22
  5. [html][xsl]Problème valeur attribut html
    Par beho dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 16/04/2005, 14h37

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