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 :

appliquer plusieurs templates


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2003
    Messages : 17
    Points : 19
    Points
    19
    Par défaut [RESOLU]appliquer plusieurs templates
    bonjour tous !

    Revoila un petit probleme, maintenant que j'arrive a utiliser une variable, et a appliquer le bon template, je voudrais appliquer plusieurs templates differents sur certains elements, sans connaitre a l'avance quels sont ces elements:
    pour etre plus clairm j'ai cree une feuille de style generique appliquant un template pour les nodes elements, et un pour les nodes texte.
    Je voudrais maintenant inclure la feuille de style attachee au fichier xml, et appliquer d'abord mon template generique, puis imbrique dedans aplliquer le template propre a l'element :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="node()">
     ...
      <xsl:call-template name="????" />
      <xsl:apply-templates >
     ...
      </xsl:apply-templates>
        </span>
    </xsl:template>
    je precise ma question, il afut apparement pour appliquer un template sans changer de node utiliser <xsl:call-template > en passant le nom du template a appliquer dans l'attribut name. mais est il possible de passer une variable dans l'attribut name ? j'ai essaye avec la methode name(), mais ca ne semble pas possible... donc est-ce possible de stocker le nom de mon element dans une variable, et de passer la variable au parametre name ???

    Voila, j'espere etre un peu clair quand meme.

    d'avance merci

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 33
    Points : 39
    Points
    39
    Par défaut
    pas à ma connaissance
    mais rien ne t'empêche de faire un xsl:choose en recréent le mapping
    (when test="$myvar='a'">call-template name='a)
    If it can go wrong, it will.

  3. #3
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:call-template name="afficher_noeud">
       <xsl:with-param name="nom" select="name()"/>
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 33
    Points : 39
    Points
    39
    Par défaut
    aussi LOL
    If it can go wrong, it will.

  5. #5
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2003
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Oui c'est pas bete tout ca, mais ca ne regle pas totalement mon probleme, parceque je devrai donc creer ce template afficher_noeud dans lequel je testerai la valeur de nom. et lancerai le bon template en fonction de ce dernier...

    cela implique donc des restrictions dans la redaction de mon template "d'affichage" hors ce que je veux, c'est en gros, inclure la feuille de style contenant les templates d'affichage dynamiquement, quelle qu'elle soit... en gros je veux que cela soit possible avec toute feuille de style accompagnant n'importe quel fichier xml.

    je ne connais donc pas le nom des elements a l'avance. si j'ai tout compris, avec la solution proposée, je dois créer un template afficher_noeud ds ma xsl inclue. ce qui veux dire, que le format de cette derniere doit etre de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="afficher_noeud">
      <xsl:parm name="nom" />
      <xsl:if nom ="paragraph">
    ... mon template paragraph
      </xsl:if>
      <xsl:if nom="blah">
    et...
    vrai? ou me trompe-je ?

    n'est il pas donc possible de faire tout cela de facon dynamique sans contrainte ds ma xsl inclue ?
    ... la est toute la question ...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 33
    Points : 39
    Points
    39
    Par défaut
    Que penses-tu de :
    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
     
     
    <xsl:template match="afficher_noeud">
      <xsl:param name="nom"/>
      <xsl:variable name="avec-nom">
        <xsl:copy>
          <xsl:attribute name="nom">
            <xsl:value-of select="$nom"/> 
          </xsl:attribute>
        </xsl:copy>
       <xsl:apply-templates select="$avec-nom" mode="process"/>
      </xsl:variable>
     
    </xsl:template>
     
     <xsl:template match="afficher_noeud[@nom='paragraph']" mode="process">
    </xsl:template>
    A noter qu'avec MSXML, il faudra utiliser msxsl:node-set
    If it can go wrong, it will.

  7. #7
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2003
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Merci a tous pour votre aide,

    je viens pour ma part de decouvrir les joies de l'element <xsl:apply-imports>

    et voila e gros ce que ca donne :

    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
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
      <xsl:import href="content-e2.xsl" />
     
    ...
     
    <xsl:template match="node()">
      <xsl:param name="current-path" /> 
      <span class="xelem">
        <xsl:attribute name="id">
          <xsl:value-of select="./@id" />
        </xsl:attribute>
        <xsl:attribute name="xpath">//<xsl:value-of select="name()" />
        </xsl:attribute>
        <xsl:attribute name="template">
          <xsl:value-of select="name()" />
        </xsl:attribute>
        <xsl:apply-imports /> 
      </span>
    </xsl:template>
    Et la, est applique le template correspondant dans ma feuille de style importee sans avoir a modifier cette derniere. Il est toutefois dommage qu'il ne soit pas possible de passer des parametres avec apply-imports.

    cela dit cela fonctionne pour l'instant, du moins tant que les apply-templates de la feuille importee ne passent pas non plus de parametres.

  8. #8
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    Et la, est applique le template correspondant dans ma feuille de style importee sans avoir a modifier cette derniere. Il est toutefois dommage qu'il ne soit pas possible de passer des parametres avec apply-imports.
    je n'en suis pas certain, mais je pense que les paramètres et les variables globales d'une feuille parente sont accessibles par ses filles (du moins avec xsl:include, avec xsl:import c'est peutêtre différent), ce qui permet déjà de faire un petit paramétrage... Maintenant tu peux aussi utiliser apply-templates plutot que apply-imports si vraiment tu es sur qu'il n'y a pas de redéfinition de template (d'où l'utilité de apply-imports ). Car avec un apply-template, tu peux passer des paramètres
    A+
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

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

Discussions similaires

  1. [Java3D] Texture : Appliquer plusieurs fois
    Par akito dans le forum 3D
    Réponses: 2
    Dernier message: 21/03/2012, 14h52
  2. Réponses: 14
    Dernier message: 15/06/2005, 13h14
  3. Appliquer plusieurs styles à une zone
    Par hdd dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 03/12/2004, 15h46
  4. [VB.NET] Appliquer plusieurs fois la même fonction...
    Par MiJack dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/09/2004, 10h52
  5. [XSL]Appliquer plusieurs feuilles XSL successivement
    Par philemon_siclone dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 12/12/2003, 19h11

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