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]Test if


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Points : 81
    Points
    81
    Par défaut [XSLT]Test if
    Bonjour,

    J'ai le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?xml version="1.0" encoding="iso-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="transformation.xsl"?>
    <agenda>
    	<jour nom="lundi">
                <evenement type="administratif">
    		<titre>Réunion du CA</titre>
            	<lieu>Salle du conseil - Istase</lieu>
            	<heure_debut>10h</heure_debut>
    		<heure_fin>12h</heure_fin>
    		<notes>Parler de la pluie et du beau temps</notes>
    	    </evenement>
    	    <evenement type="loisir">
    		<titre>Repas</titre>
            	<lieu>Quick</lieu>
            	<heure_debut>12h</heure_debut>
    		<heure_fin>13h</heure_fin>
    		<notes>Sortir ma carte étudiante pour le 2° burger gratuit</notes>
    	   </evenement>
            </jour>
    	<jour nom="mardi">
                <evenement type="administratif">
    		<titre>CSW - E-mailing</titre>
            	<lieu>Salle du conseil</lieu>
            	<heure_debut>9h</heure_debut>
    		<heure_fin>10h</heure_fin>
    		<notes>Secouer les élèves car ça avance pas...</notes>
    	    </evenement>
    	    <evenement type="todo">
    		<titre>MAJ Site web</titre>
            	<lieu>Mon bureau</lieu>
            	<heure_debut>10h15</heure_debut>
    		<heure_fin>12h</heure_fin>
    		<notes>Changer la couleur de fond</notes>
    	    </evenement>
    	    <evenement type="loisir">
    		<titre>Repas</titre>
            	<lieu>McDo</lieu>
            	<heure_debut>12h</heure_debut>
    		<heure_fin>13h</heure_fin>
    		<notes></notes>
    	     </evenement>
    	</jour>
    </agenda>
    Je voudrais arriver via xlst à une page html de ce type:
    http://julien.paleni.free.fr/istase/tableau.jpg

    Je n'arrive pas à démarrer car je débute en xml et xslt.
    Je n'arrive pas à écrire un if qui permet par exemple de placer un évènement dans une colonne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="jour[@nom]='lundi">...</xsl>
    Quelqu'un peut-il m'aider à démarrer svp?

    Je ne vois pas trop comment écrire le code xslt, comment l'organiser pour être exact.

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    La syntaxe dont il est question est celle de XPath.

    Il faut d'abord avoir à l'esprit la notion de noued courant dans l'arbre correspondant au document XML : comme pour une arborescence de fichiers, "jour" correspond à un élément jour en dessous du noeud courant tandis que "/agenda/jour" correspond à un élément jour au dessous d'un élément agenda directement sous la racine.

    Pour être plus exact, "jour" représente en réalité tous les éléments jour en dessous du noeud courant.

    "jour/@nom" représente tous les attributs nommé "nom" situé sous un élément jour

    "jour[@nom = 'lundi'] représente le ou les éléments jour ayant un attribut "nom" ayant lui-même la valeur 'lundi' : c'est le test que vous souhaitez faire !

    "jour[@nom] = 'lundi'" reviendrait à tester s'il existe au moins un élément jour disposant d'un attribut nom et que cet élément ait un sous-noeud texte de valeur 'lundi' comme dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <jour nom="nimportequoi">lundi</jour>
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  3. #3
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    as tu un exemple simple de ce que tu veux faire avec ton if
    donne nous un xml source simple, un xml cible simple et on peux voir pour te faire un xslt explicitant comme obtenir ton xml

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Points : 81
    Points
    81
    Par défaut
    Merci Alain pour tes explications, je pense que je vais pouvoir avancer avec.

    @fraoustin:

    le xml source c'est celui que j'ai mis dans le 1° post
    je veux arriver à une page html avec un tableau comme celui-la: http://julien.paleni.free.fr/istase/tableau.jpg

    pour le if, je voudrais tester la valeur de l'attribut nom du noeud jour afin de pouvoir mettre les évènements qui sont dessous dans la bonne colonne

    en espérant être suffisamment clair...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Points : 81
    Points
    81
    Par défaut
    J'ai avancé dans ma transformation XSLT grâce à Alain.

    J'ai néanmoins un problème:
    Le résultat de la transformation est: http://julien.paleni.free.fr/istase/depart.xml
    La transformation est: http://julien.paleni.free.fr/istase/transformation.xsl

    Pourquoi est ce que les <evenement> du xml source s'affiche à la suite les uns des autres?
    En clair, pourquoi est ce que les <evenement> du mardi ne se trouve pas dans les premières cases de la colonne mardi? Idem pour mercredi.

    Autre question:
    Est il possible d'attribuer un style CSS à partir d'un test effectué sur l'attribut "type" du noeud <evenement>?
    En clair, est qu'en testant "type", je peux colorier le fond de la cellule d'une couleur suivant le résultat?

  6. #6
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    La présentation en colonne est toujours délicate en XSL-T parce qu'il faut construire cela selon un document bien formé alors qu'en HTML on doit donner des lignes.

    Admettons que votre présentation soit d'une ligne par semaine sans ligne vide : il faut faire une sélection de chaque rendez-vous qui n'est pas dans la même semaine que celui qui le précède dans le temps pour créer autant de lignes de semaine. Dans chaque ligne on va mettre pour chaque jour tous les rendez-vous de ce jour triés par heure et cela pour les 7 jours.

    Une transformation XSL-T est efficace quand on arrive à trouver la bonne condition logique de parcours...

    Pour ce qui est de styles différents selon des valeurs, cela ne pose pas de problème en XSL-T avec, par exemple, l'utilisation de <xsl:choose> (l'équivalent du switch L3G) et permet de calculer un attribut.

    Pour un attribut complexe comme style, l'utilisation d'une variable, de la fonction concat(),... peuvent s'imposer.

    L'éditeur de message a un comportement bizarre depuis IE7 ! ?
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Points : 81
    Points
    81
    Par défaut
    Pour l'organisation du tableau, je vais la laisser en standby pour le moment.

    Ne manque t-il pas un mot dans votre réponse Alain?
    Pour ce qui est de styles différents selon des valeurs, cela ne pose pas de problème en XSL-T avec, par exemple, l'utilisation de ?? (l'équivalent du switch L3G) et permet de calculer un attribut.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Points : 81
    Points
    81
    Par défaut
    merci pour la correction Alain, j'ai pu avancer.

    J'ai une question concernant un <xsl:sort>
    Voilà le xml de départ (je l'ai allégé pour le forum):
    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
    <agenda>
    	<evenement>
    		<type>loisir</type>
    		<jour>lundi</jour>
    		<titre>Repas</titre>
    		<lieu>Quick</lieu>
    		<heure_debut>12h</heure_debut>
    		<heure_fin>13h</heure_fin>
    		<notes>Sortir ma carte étudiante pour le 2° burger gratuit</notes>
    	</evenement>
    	<evenement>
    		<type>administratif</type>
    		<jour>lundi</jour>
    		<titre>Réunion du CA</titre>
    		<lieu>Salle du conseil - Istase</lieu>
    		<heure_debut>10h</heure_debut>
    		<heure_fin>12h</heure_fin>
    		<notes>Parler de la pluie et du beau temps</notes>
    	</evenement>
    </agenda>
    Voilà le fichier de transformation:
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
        <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" />
     
        <xsl:template match="/">
            <html>
            	<head>
            		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
            		<title>Mon agenda</title>
           		</head>
            	<body>
                	<xsl:apply-templates match="/" />
           		</body>
            </html>
        </xsl:template>
     
        <xsl:template match="agenda">
            <table border="1">  
                <tr bgcolor="#0000FF">
                    <td width="120px">Lundi</td>
                    <td width="120px">Mardi</td>
                    <td width="120px">Mercredi</td>
                    <td width="120px">Jeudi</td>
                    <td width="120px">Vendredi</td>
                </tr>  
                <xsl:apply-templates match="evenement" />     	
            </table>
        </xsl:template>
     
        <xsl:template match="evenement">
            <tr>
                <td width="175px">
                    <xsl:call-template name="lundi" /> 
               </td>
               <td width="175px">
                   <xsl:call-template name="mardi" />
               </td>
               <td width="175px">
                   <xsl:call-template name="mercredi" />
               </td>
               <td width="175px">
                   <xsl:call-template name="jeudi" />
               </td>
               <td width="175px">
                   <xsl:call-template name="vendredi" />
               </td>
            </tr>
        </xsl:template>  
     
        <xsl:template name="lundi">
            <xsl:if test="jour = 'lundi'">
                <xsl:call-template name="type" />
            </xsl:if>
        </xsl:template>
     
        <xsl:template name="mardi">
            <xsl:if test="jour = 'mardi'">
                <xsl:call-template name="type" />
            </xsl:if>
        </xsl:template>
     
        <xsl:template name="mercredi">
            <xsl:if test="jour = 'mercredi'">
                <xsl:call-template name="type" />
            </xsl:if>
        </xsl:template>
     
        <xsl:template name="jeudi">
            <xsl:if test="jour = 'jeudi'">
                <xsl:call-template name="type" />
            </xsl:if>
        </xsl:template>
     
        <xsl:template name="vendredi">
            <xsl:if test="jour = 'vendredi'">
     
                <xsl:call-template name="type" />
            </xsl:if>
        </xsl:template>
     
     
     
        <xsl:template name="type">
            <xsl:choose>
                <xsl:when test="type='administratif'">
                    <td bgcolor="#FF0000">
                        <xsl:call-template name="toto" />
                    </td>
                </xsl:when>
                <xsl:when test="type='todo'">
                    <td bgcolor="#FF00FF">
                        <xsl:call-template name="toto" />
                    </td>
                </xsl:when>
                <xsl:when test="type='loisir'">
                    <td bgcolor="#00FF00">
                        <xsl:call-template name="toto" />
                    </td>
                </xsl:when>
            </xsl:choose>
        </xsl:template>
     
     
     
        <xsl:template name="toto">
            <xsl:value-of select="titre"/><br />
            <xsl:value-of select="lieu"/><br />
            <xsl:value-of select="heure_debut"/> - <xsl:value-of select="heure_fin"/><br />
            <xsl:value-of select="notes"/>
        </xsl:template>
     
    </xsl:stylesheet>
    Je cherche à faire un tri des évènements du même jour en fonction de l'heure de début. J'ai écrit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:for-each select="evenement">
        <xsl:sort select="heure_debut" order="descending" />
    </xsl:for-each>
    Mon problème est que je sais pas où le placer dans mon code.

    Quelqu'un peut-il m'aider?

  9. #9
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Le <xsl:sort> doit être mis dans le <xsl:apply-templates match="evenement">

    Il n'y a pas besoin ici d'un <xsl:for-each>
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Points : 81
    Points
    81
    Par défaut
    merci bien

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

Discussions similaires

  1. [XSLT] Test simple (Et/Ou)
    Par domiq44 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/01/2007, 15h19
  2. [XSLT] Test xsl:if
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/12/2005, 10h05
  3. [XSLT] Test dynamique
    Par Capt. Flame dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 04/11/2005, 09h53
  4. [XSLT] Test égalité noeuds différents
    Par bruno782 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 24/10/2005, 20h58
  5. xslt --> test sur les chiffres
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/09/2005, 13h17

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