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 :

[XPath] Recherche du contenu d'un tag dont le nom est en param sur un autre tag


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut [XPath] Recherche du contenu d'un tag dont le nom est en param sur un autre tag
    Bonjour à tous!

    Je voudrais recupérer la valeur d'un tag dont le nom est en paramètre sur un autre tag:
    file.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml?>
    <model>
    <title>bonjour</title>
    <description>description de bonjour</description>
    </model>
     
    <print ref="title"/>
    file.xsl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:template match="/print">
    <xsl:value-of select="ICI JE VOUDRAIS RECUPERER LA VALEUR DU TAG DONT LE NOM EST DANS LE PARAMETRE ref
     (soit dans l'example 'bonjour' puisque ref = "title"/>
    </xsl:template>
    J'ai essayé ça (ne fonctionne pas bien sûr):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="/model//*[name(/model//*) = ./@ref][0]"/>
    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Finalement, j'ai trouvé une première solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:variable name="ref" select="./@ref"/>
    <xsl:value-of select="/model//*[name() = $ref]"/>
    Par contre, je suis obligé de déclarer préalablement la variable $ref afin de pouvoir y faire référence dans value-of. N'y a t'il pas un moyen pour faire référence au contenu de l'attribut courant "ref" directement dans l'expression xpath?

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    essaie avec current()/@ref

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Impec, ça marche

    Sinon, entre temps, ça s'est compliqué, je sais pas si je dois ouvrir un autre topic pour ça sachant que le problème est assez proche:

    Je voudrais maintenant que @ref fasse référence à un chemin depuis model et non plus à un simple nom.

    File.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml?>
    <model>
    <list1>
    <title>bonjour</title>
    <description>description de bonjour</description>
    </list1>
    <list2>
    <title>bonjour2</title>
    <description>description de bonjour2</description>
    </list2>
    </model>
     
    <print ref="list1/title"/>
    Y a t-il des fonctions pour ça?
    (un truc du genre <xsl:value-of select="/model//*[path() = current()/@ref]"/>

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    non, ça c'est impossible, désolé, il va te falloir décomposer ton chemin (et ça risque d'être lourd et pas terrible )

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Si le nombre de niveaux du chemin est figé à 2, il y a une solution (certes peu élégante) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="/model/*/*[concat(name(parent::*), '/', name()) = current()/@ref]"/>
    Si le nombre de niveaux varie d'un élément <print> à l'autre, alors il faut soit écrire une fonction XSLT dédiée comme l'indique Swoög, soit utiliser une fonction d'évaluation de XPath à condition que ton processeur XSLTpropose cette extension.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    L'astuce est bonne et pourrait résoudre mon problème de manière temporaire, mais c'est vrai que c'est peu évolutif et comme tu dis peu élégant...

    En fait, mon objectif est faire un interpréteur xforms côté serveur (avec php5 ) et de me servir de différentes feuille de style pour construire le formulaire en html/xhtml à renvoyer au navigateur, le flux xml envoyé au serveur (instance>submission), le fichier de shema pour la validation... et toujours depuis un même code xforms du type:

    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
    <xforms>
    <model xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" >
      <instance>
       <cat>
        <date xs:type="datetime">date</date>
        <title xs:type="string">bonjour</title>
        <description xs:type="string">description</description>
        <keywords xs:type="string"/>
        <icon xs:type="string"/>
        <adult xs:type="string"/>
        <statut xs:type="string"/>
       </cat>
      </instance>
      <submission id="adddircat" action="adddircat.php" method="get"/>
     </model>
     <input ref="/xforms/model/instance/cat/date"><label>Date d'ajout</label></input>
     <input ref="/cat/title"><label>Titre catégorie</label></input>
     <textarea ref="description"><label>Description catégorie</label></textarea>
     <textarea ref="keywords"><label>Mots-clefs</label></textarea>
     <input ref="icon"><label>Icon</label></input>
     <select1 ref="adult"><label>Contenu adulte?</label></select1>
     <select1 ref="statut">
     <setvalue value="1" event="xforms-ready"/>
      <label>Statut</label>
      <item>
       <label>Affiché</label>
       <value>1</value>
      </item>
      <item>
       <label>Caché</label>
       <value>2</value>
      </item>
      <item>
       <label>Rubrique spéciale</label>
       <value>2</value>
      </item>
     </select1>
     <submit submission="adddircat"><label>Ajouter rubrique</label></submit>
    </xforms>

    Je crois que je vais devoir parser avec directement avec dom (sous php), les fonctions xsl n'étant à priori pas adaptées à cet objectif (le bind est essentiel)... qu'en pensez vous? Avez vous une autre methode à suggérer?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    J'ai finalement craqué, tant pis pour l'élégance! "J'arrange" le fichier xml avec dom avant de l'envoyer à la feuille de style.

    Mais je reste tout de même étonné de ne pas avoir pu faire un appel récursif xpath depuis la feuille de style. C'est vrai que je débute

    Merci à tous en tout cas et pour le sujet initial du topic, on peut le considérer comme [resolu]

Discussions similaires

  1. Instancier une classe dont le nom est contenu dans une String
    Par fyque dans le forum Général Python
    Réponses: 15
    Dernier message: 13/06/2008, 12h33
  2. Réponses: 7
    Dernier message: 25/05/2008, 14h02
  3. Réponses: 7
    Dernier message: 25/10/2005, 15h19
  4. Réponses: 2
    Dernier message: 21/09/2005, 13h35
  5. [Reflection] Executer une fonction dont le nom est contenu dans un String
    Par christobal dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/07/2004, 15h23

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