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] Tri de date par mois : comment faire ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut [XSLT] Tri de date par mois : comment faire ?
    Bonjour,

    Débutant en XSLT, je souhaite générer un tableau HTML de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <TABLE>
      <TR><TD colspan="2">Mars 2006</TD></TR>
      <TR><TD>10/03/2006</TD><TD>Event 5</TD></TR>
      <TR><TD>01/03/2006</TD><TD>Event 4</TD></TR>
     
      <TR><TD colspan="2">Février 2006</TD></TR>
      <TR><TD>25/02/2006</TD><TD>Event 3</TD></TR>
      <TR><TD>11/02/2006</TD><TD>Event 2</TD></TR>
     
      <TR><TD colspan="2">Janvier 2006</TD></TR>
      <TR><TD>08/01/2006</TD><TD>Event 1</TD></TR>
    </TABLE>
    à partir du XML suivant :
    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
    <TEST>
    	<ITEM>
    		<DATE>10/03/2006</DATE>
    	    	<EVT>Event 5</EVT>
    	</ITEM>
    	<ITEM>
        		<DATE>01/03/2006</DATE>
    	    	<EVT>Event 4</EVT>
    	</ITEM>
    	<ITEM>
    	    	<DATE>25/02/2006</DATE>
    	    	<EVT>Event 3</EVT>
    	</ITEM>
    	<ITEM>
    	    	<DATE>11/02/2006</DATE>
    	    	<EVT>Event 2</EVT>
    	</ITEM>
    	<ITEM>
    	    	<DATE>08/01/2006</DATE>
    	    	<EVT>Event 1</EVT>
    	</ITEM>
    </TEST>
    J'ai essayé pas mal de choses, mais sans succès. Comment tester le changement de mois dans les dates pour pouvoir insérer la ligne de titre contenant le mois entre les lignes d'items ?

    Merci d'avance.

    SdkDdk
    L'assembleur c'est plus facile que le XSL !

  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 : 48
    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
    Tu veux une reponse avec un xml ordonné
    - test sur le preceding-sibling
    ou non ?
    - fonction recursive de 1 à 12 ?

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,

    Merci pour la réponse. J'ai trouvé une solution entre temps mais elle n'est pas parfaite. Voici ce que j'ai fait :
    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
    <xsl:template match="/">
    ...
          <table border="1">
            <xsl:call-template name="afficherItems">
    		  <xsl:with-param name="vmoisprec">0</xsl:with-param>
    		  <xsl:with-param name="position">1</xsl:with-param>
    		</xsl:call-template>
          </table>
    </xsl:template>
     
    <xsl:template name="afficherItems" match="TEST">
       <xsl:param name="vmoisprec" />
       <xsl:param name="position"/>
     
      <xsl:if test="$position &lt;= count(TEST/ITEM)">
     
        <xsl:variable name="vmois" select="substring(TESTS/ITEM[position()=$position]/DATE,4,2)" />
     
        <xsl:variable name="vdate" select="not($vmois = $vmoisprec)" />
     
        <xsl:if test="$vdate='false'">
     
          <xsl:choose>
          <xsl:when test="$vmois='01'">
            <tr><td><xsl:value-of select="concat('Janvier ', substring(TEST/ITEM[position()=$position]/DATE,7,4))" /></td></tr>
          </xsl:when>
    ...
          <xsl:when test="$vmois='12'">
            <tr><td><xsl:value-of select="concat('Décembre ', substring(TEST/ITEM[position()=$position]/DATE,7,4))" /></td></tr>
          </xsl:when>
          </xsl:choose>
     
        </xsl:if>
     
        <tr>
          <td>
            <xsl:value-of select="TEST/ITEM[position()=$position]/DATE" />
          </td>
          <td>
            <b><xsl:value-of select="TEST/ITEM[position()=$position]/EVT" /></b>
          </td>
        </tr>
     
        <xsl:call-template name="afficherItems">
          <xsl:with-param name="vmoisprec"><xsl:value-of select="$vmois"/></xsl:with-param>
          <xsl:with-param name="position"><xsl:value-of select="$position+1"/></xsl:with-param>
      </xsl:call-template>
     
    </xsl:if>
     
    </xsl:template>
    Ca marche mais il faut que mes items soient triés par date dans le fichier XML source. Une solution indépendante de l'ordre des items m'intéresserait.

    J'ai un autre problème particulièrement irritant, mais je ne sais pas si il faut ouvrir un second fil ou pas pour l'évoquer : je pose la question ici (si ce n'est pas bon, merci de me le dire, j'ouvrirai un autre fil).

    Certains évènements <EVT> contiennent des tags HTML, notamment des retours à la ligne (<BR />). Avec une DTD du type :
    <!ELEMENT TEST (ITEM)*>
    <!ELEMENT ITEM (DATE,EVT)>
    <!ELEMENT DATE (#PCDATA)>
    <!ELEMENT EVT (#PCDATA)>
    la transformation se fait parfaitement lorsque j'ouvre le fichier XML avec IE6 qui servira effectivement à terme à afficher les données. Mais d'un autre côté, je souhaite garnir le fichier .XML d'entrée via une interface graphique développée en C++ sous VC6. Pour ce faire j'utilise le SDK MSXML 4 SP2. Lorsque je charge le fichier .XML j'obtiens un code d'erreur "Element content is invalid according to the DTD/Schema. Expecting: #PCDATA".

    Si je retire les tags <BR /> de mes éléments <EVT> ça marche très bien (je peux lire le .XML et ajouter des items dedans sans pb). Si je mets le contenu des <EVT> dans des blocs <![CDATA[...]]>, MSXML 4 ne couine plus non plus au chargement du XML, mais IE6 n'interprète plus les tags <BR /> contenus dedans.

    D'après ce que j'ai compris, IE6 utilise MSXML3, ce qui explique la différence de comportement observée entre lui et mon code. La question est donc : comment faire pour faire accepter des tags <BR /> dans des éléments <EVT> à MSXML 4 en obtenant qu'IE6 les traite comme des retours à la ligne et non pas comme du texte ?

    Merci.

  4. #4
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,

    Pour le problème de tags HTML inclus dans le XML source et interprétés différemment entre MSXML 3 et MSXML 4, j'ai trouvé la solution : je déclare les éléments correspondants en type 'ANY' dans la DTD et je fais des xsl:copy-of dans la feuille XSL.

    Par contre, je butte toujours sur le tri des dates dans le cas où mes items ne sont pas triés dans le fichier XML.

    SdkDdk

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    et t'as essayé xsl:sort, pour du tri ca me semble bien indiqué.
    Pour le PCDATA expected, je ne coprend pas où est le problème avec ta balise <br />, encore si t'avais du javascript inline je dis pas, mais la c'est une simple balise!

  6. #6
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,

    Merci pour la réponse.

    Pour le tri des dates, le xsl:sort ne donne pas satisfaction car il les trie comme des chaînes, pas comme des dates (mais il y a sûrement une subtilité qui m'échappe).

    Pour le PCDATA expected, MSXML 4 refuse de charger un document DOM dont un élément déclaré comme #PCDATA contient une balise. J'ai déclaré l'élément en ANY dans la DTD et j'ai déclaré les éléments (BR, B, I, U, SUB, SUP) qui pouvaient être inclus dans l'élément.

    SdkDdk

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/08/2007, 13h32
  2. Tri de dates par liste déroulante
    Par TBMB51 dans le forum Access
    Réponses: 2
    Dernier message: 15/01/2007, 14h55
  3. tri des dates par semaine
    Par syldudu dans le forum Access
    Réponses: 17
    Dernier message: 10/10/2006, 11h27
  4. [XSLT] Tri de dates
    Par Zapan dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 09/02/2006, 16h36
  5. Réponses: 6
    Dernier message: 16/09/2005, 10h30

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