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] Croiser plusieurs xsl:for-each avec deux documents XML


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] Croiser plusieurs xsl:for-each avec deux documents XML
    Salut à tous,

    Voilà mon problème. En plus du document XML source que je souhaite transformer, je dois récupérer des valeurs dans un autre fichier XML. Pour y faire appel j'utilise la fonction document().

    Voilà ce que ça 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
    21
    <xsl:variable name="descripteurs" select="document('../xml/Descripteurs.xml')/DESCRIPTEURS/ITEM" />
      <xsl:template name="Descripteurs">
        <xsl:for-each select="$descripteurs">
          <li>
            <xsl:value-of select="@texte"/>
            <ul>
              <xsl:for-each select="VIDEOS_PUBLIEES/VIDEO">
                <xsl:if test="TYPE_CONCERT = $typeMedia">
                  <xsl:for-each select="DESCRIPTEUR">
                    <xsl:if test="@Genre = $descripteurs/@texte">
                      <li style='font-size: medium'>
                        <xsl:value-of select="../@TITRE" />
                      </li>
                    </xsl:if>
                  </xsl:for-each>
                </xsl:if>
              </xsl:for-each>
            </ul>
          </li>
        </xsl:for-each>
      </xsl:template>
    Gros problème : A partir de la ligne <xsl:for-each select="$descripteurs"> ma feuille XSLT se base sur les noeuds du document extérieur. Quand je fais ensuite <xsl:value-of select="@texte"/>, il prend bien la valeur de l'attribut "texte" d'un des item de la variable $descripteurs.

    Par contre quand je fais <xsl:for-each select="VIDEOS_PUBLIEES/VIDEO"> je souhaite qu'il fasse une boucle sur les noeuds VIDEO de mon XML source, et plus de la variable $descripteurs.

    Je ne comprends pas comment les différencier (sans parler qu'après j'ai encore moult xs:for-each et xsl:value-of qui font se croiser les deux boucles.

    Merci d'avance pour vos éclaircissements.

  2. #2
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    Par contre quand je fais <xsl:for-each select="VIDEOS_PUBLIEES/VIDEO"> je souhaite qu'il fasse une boucle sur les noeuds VIDEO de mon XML source, et plus de la variable $descripteurs.

    tu veux dire que cette boucle parcours un autre XML que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="$descripteurs">
    ?????


    Si oui , ca ne peut pas marcher, je pense qu'il faut que tu utilise call-template et créer un autre template dans lequel tu spécifies le chemin du XML.

  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
    Mmmmh... J'ai déjà essayé ce genre de chose, mais ça n'a rien donné. De toute façon j'ai besoin de savoir où j'en suis dans mes boucles, comme si je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i = 0 To nodelist.length
    print nodelist.item(i);
    Mais avec plusieurs boucles imbriquées, qui effectivement renvoient à deux fichiers XML différents.

    J'ai beau chercher je suis bloqué...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Justement le call template appellé dans une premiere premiere boucle dans le premier contexte permettrait de faire une autre boucle dans l'autre contexte.

  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
    Citation Envoyé par Morbo
    Justement le call template appellé dans une premiere premiere boucle dans le premier contexte permettrait de faire une autre boucle dans l'autre contexte.
    J'entends bien, mais à un moment donné j'ai besoin de comparer des valeurs des deux boucles, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (nodelist.item(i) = nodelist2.item(j))
    A moins que je balance en paramètre dans le call-template la position du noeud de la boucle que je parcourt en amont.

    Je vais essayer ça à tout hasard...

  6. #6
    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
    Citation Envoyé par strat0
    A moins que je balance en paramètre dans le call-template la position du noeud de la boucle que je parcours en amont.
    Contre toute attente, ça a marché.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:call-template name="Descripteurs">
              <xsl:with-param name="positiondesc" select="position()" />
    </xsl:call-template>

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

Discussions similaires

  1. [XSLT] XSLT sort dans un for-each avec select sur un param
    Par tralloc dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 23/11/2012, 09h06
  2. xsl:for-each avec un parametre pour select
    Par arnog dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/08/2008, 13h09
  3. [XSL] For each avec variables imbriquées
    Par Wells dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/05/2008, 19h28
  4. Réponses: 5
    Dernier message: 27/03/2007, 18h39
  5. [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

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