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] ouvrir un tag avec conditionnement.


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut [XSLT] ouvrir un tag avec conditionnement.
    Bonjour,

    J'ai l'impression qu'il sera difficile de résoudre mon problème... mais on ne sait jamais, j'espère que quelqu'un aura des pistes pour chercher!

    Résumé
    En partant d'un fichier XML, j'aimerais bien obtenir un document HTML. Ce document HTML contient des tables.
    Lors du traitement XSLT, si le "path" de certains éléments est répertorié dans un fichier XML annexe, j'affiche ma table dans une couleur différente.

    Problème
    J'aimerais que mon code contienne la déclaration de ma table une seule fois, vu que les données sont toujours les mêmes, mais je n'y arrive pas.

    Explications plus complète

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="//test:element[@attr='OK']"/>
    Tout d'abord, je convertis le path de l'élément dans le format attendu. (C'est un peu lourdingue comme traitement, mais pour l'instant je n'ai pas mieux...)

    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
     
    <xsl:template match="test:element">
     
            <xsl:variable name="chemin1">
              <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="saxon:path()" />
                <xsl:with-param name="replace" select="'/'" />
                <xsl:with-param name="by" select="'/test:'" />
              </xsl:call-template>
            </xsl:variable>
     
            <xsl:variable name="chemin2">
              <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="$chemin1" />
                <xsl:with-param name="replace" select="'premierelement'" />
                <xsl:with-param name="by" select="'premierelement[1]'" />
              </xsl:call-template>
            </xsl:variable>
    Dans le traitement, je regarde si le path de l'élément traité est référencé dans mon fichier annexe. Si c'est le cas, j'applique un tbody d'une classe différente.
    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:choose>
              <xsl:when test="document('monfichier.xml')//liste-chemins/chemin = $chemin2" >
               	<tbody class="bienvoyant">
               </xsl:when>
               <xsl:otherwise>
               	<tbody class="bienterne">
               </xsl:otherwise              
         </xsl:choose>  
     
         	[...]
         	longue déclaration de toute la table
         	[...]     	
         	</tbody>
    </xsl:template>

    Les plus vigilants d'entre vous auront bien évidemment remarqué que ça, ce n'est pas de l'xml, et ça ne passera pas. Le tag "tbody" est ouvert sans être fermé à temps. Mais ça donne une idée de ce que je voudrais réaliser.


    • J'avais pensé mettre les tags tbody autour de l'appel au traitement template, mais à ce moment là, je ne vois pas comment je pourrais récupérer le path de l'élément traité pour effectuer le "choose"...
    • Il y a moyen de recopier la table plusieurs fois dans la condition, mais elles sont longues, et ça amènerait à doubler le code vraiment inutilement.
    • J'aurais bien utilisé un paramètre pour dire aux tags html de la table de quelle classe il font partie... mais ce n'est pas possible de mettre des paramètres en HTML.
    • J'ai cherché quelquechose en HTML qui dirait: "à partir d'ici, et jusque là, tu utilise ce style là", mais je n'ai pas trouvé...


    Bref, je suis à court de ressources...


    Merci d'avance à celui qui aura une idée de solution!

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Y a-t-il quelque chose qui empêche de faire par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:variable name="body-class">
      <xsl:choose>
        <xsl:when test="... condition ...">bienvoyant</xsl:when>
        <xsl:otherwise>bienterne</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <tbody class="{$body-class}">
     
      [...]
      longue déclaration de toute la table
      [...]     	
    </tbody>
    ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Et bien non, absolument rien n'empêche de faire ça dans ce cas-ci! Au contraire.


    J'avais pourtant cherché comment mettre une variable dans les tags html, sans trouver. (J'ai l'impression d'avoir vu ces accolades quelque part pourtant, dommage de ne pas y avoir fait plus attention.)

    Effectivement, je ne suis pas un pro, ni de l'XSLT, ni de l'HTML... même si pour l'instant, je m'amuse bien avec ces bête-là: plus on découvre de trucs, plus on se rend compte qu'on arrive facilement à obtenir ce que l'on veut. (Et là je découvre un truc de base...)


    Merci beaucoup! Ca fera quelques ko de code de sauver... et surtout une maintenance bien moins pénible et risquée. ;-)

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Tu devrais aussi t'intéresser à xsl:attribute. Si on les met dans un xsl:choose, c'est un moyen simple de mettre un attribut ou pas, sous condition.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Merci, je n'ai encore jamais utilisé "xsl:attribute", c'est intéressant.


    A noter que pour retrouver le path complet et détaillé d'un élément, j'ai mieux que ce que je montre plus haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsl:template match="*" mode="get-path">
    		<xsl:apply-templates select="parent::*" mode="get-path" />
    		<xsl:variable name="element-name"><xsl:value-of select="name()"/></xsl:variable>
    		<xsl:text>/namespace:</xsl:text>
    		<xsl:value-of select="name()" />
    		<xsl:text>[</xsl:text><xsl:value-of select="1+count(preceding-sibling::*[name()=$element-name])"/><xsl:text>]</xsl:text>
    	</xsl:template>
    que l'on appelle bien évidemment comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="." mode="get-path" />

    On ne sait jamais que ça serve à quelqu'un un jour...
    Et si il y a encore mieux, je suis preneur, même si là ça commence à me convenir.
    (Là, je suis en train de chercher comment récupérer automatiquement le préfixe du namespace...)

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

Discussions similaires

  1. [XSLT] fichier.xml?tag=import récupérer avec get
    Par LeXo dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/10/2007, 15h28
  2. [XSLT]tableau double entrée avec cellule manquante
    Par nferay dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 08/03/2005, 16h07
  3. ouvrir plusieurs fenetre avec un lien
    Par demanghonj dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 21/10/2004, 11h35
  4. [Système] Ouvrir fichier externe avec prog par défaut de l'OS
    Par Pill_S dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 30/05/2004, 12h54
  5. ouvrir 2 frames avec un lien
    Par Slash dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 07/03/2003, 10h44

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