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] Chemin très tarabiscoté dans un xsl:for-each


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut [XSLT] Chemin très tarabiscoté dans un xsl:for-each
    Bonjour,

    Voilà, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:variable name="concerts" select="document('../xml/ListeConcertsPublies.xml')/CONCERTS_PUBLIES/CONCERT" />
    <xsl:variable name="catégorie">
        <item valeur="Titres" titre="Titres des concerts" />
        <item valeur="Oeuvres" titre="Oeuvres exécutées" />
        <item valeur="Auteurs" titre="Compositeurs / auteurs" />
        <item valeur="Interprètes" titre="Interprètes" />
        <item valeur="Saisons" titre="Saisons" />
      </xsl:variable>
    <xsl:variable name="cheminTitres" select="'/INFOS_TITRE'" />
      <xsl:variable name="cheminOeuvres" select="'/OEUVRES/OEUVRE'" />
      <xsl:variable name="cheminAuteurs" select="'/AUTEURS/AUTEUR'" />
      <xsl:variable name="cheminInterprètes" select="'/INFOS_TITRE'" />
      <xsl:variable name="cheminSaisons" select="''" />
    N.B : J'accède parfaitement aux différents "item" de la variable catégorie avec la fonction node-set de mon parseur msxml.

    Et je cherche à créer un chemin dans un for-each qui ressemblerait à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="$concerts + concat('$chemin', $catégorie)[count(. | key(concat('key_Tout_', $catégorie), @Initiale)[1]) = 1]">
    Ce qui donnerait par exemple dynamiquement (car il y a déjà plusieurs for-each au-dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="/CONCERTS_PUBLIES/CONCERT/INFOS_TITRE[count(. | key('key_Tout_Titres', @Initiale)[1]) = 1]">
    Mais je bloque. Ça marche quasiment sauf au niveau de "$concerts + concat('$chemin', $catégorie)". Je ne sais pas trop comment le concaténer et le concaténer avec la fin du chemin de manière à créer la collection de noeuds attendue. Et je ne suis pas certain de pouvoir appeller un nom de variable dynamiquement (la partie "concat('$chemin', $catégorie)").

    Merci pour votre aide.

  2. #2
    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
    Bonjour,

    comme tu dis, c'est tarabiscoté...

    La résolution d'expressions XPath dynamiques n'est pas possible en XSLT. Si tes chemins se limitent aux éléments fils de CONCERT, ceci devrait être possible (pense toutefois à retirer les slashes dans les select de tes variables) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="$concerts/*[name() = $chemin][count(. | key(concat('key_Tout_', $catégorie), @Initiale)[1]) = 1]">

  3. #3
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Ça devrait fonctionner mais il me reste un problème : comment appeller une variable avec un nom dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat('$chemin', $catégorie)
    Pour appeller dans ma boucle chacune des variable $cheminTitres, $cheminOeuvres, etc...

    Cette façon ne fonctionne pas.

  4. #4
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Bon je m'y prenais comme une brêle avec mon histoire de nom de variable dynamique.

    J'ai fusionné les variables catégorie et chemin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:variable name="catégorie">
        <item valeur="Titres" titre="Titres des concerts" chemin="INFOS_TITRE" />
        <item valeur="Oeuvres" titre="Oeuvres exécutées" chemin="OEUVRES/OEUVRE" />
        <item valeur="Auteurs" titre="Compositeurs / auteurs" chemin="AUTEURS/AUTEUR" />
        <item valeur="Interpretes" titre="Interprètes" chemin="INTERPRETES/INTERPRETE" />
        <item valeur="Saisons" titre="Saisons" chemin="" />
      </xsl:variable>
    Ensuite j'ai ça (je simplifie volontairement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:for-each select="msxml:node-set($catégorie)/item">
            <xsl:variable name="catégorie" select="@valeur" />
            <xsl:variable name="chemin" select="@chemin" />
    <xsl:for-each select="$concerts/*[name() = $chemin][count(. | key(concat('key_Tout_', $catégorie), @Initiale)[1]) = 1]">
    </xsl:for-each>
    </xsl:for-each>
    Et là ça marche sauf... que ça ne le fait que pour le premier item de catégories : "Titres".

  5. #5
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    J'ai isolé le problème (la raison pour laquelle ça ne fonctionne qu'avec "Titres").

    "Titres" est le seul à avoir comme attribut un chemin à un seul noeud, les autres ont soit deux noeuds séparés d'un slash, soit rien ("Saisons").

    Or le [name() = $chemin] que m'a proposé GrandFather veut le nom d'un noeud et un seul.

    Quelqu'un a-t-il une autre alternative car je suis près du but?

Discussions similaires

  1. [XSLT] Croiser plusieurs xsl:for-each avec deux documents XML
    Par strat0 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 21/06/2007, 16h10
  2. [XSLT][débutant] Problème xsl:value-of dans xsl:for-each
    Par Choubie dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/05/2007, 16h30
  3. Réponses: 5
    Dernier message: 27/03/2007, 18h39
  4. [XSLT] combiner xsl:for-each-group et tokenize() ?
    Par Goulu dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/12/2006, 15h54
  5. [PHP] [XSLT] utilisation, de javascript dans le xsl
    Par vodasan dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2006, 15h38

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