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] problème pour gérer plusieurs modèles dans une feuille


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 6
    Par défaut [XSLT] problème pour gérer plusieurs modèles dans une feuille
    Bonsoir,

    je tente de faire une feuille xslt pour le document xml suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <MoDyCo>
    <chercheur>cori</chercheur>
    <chercheur>minel</chercheur>
    <DOC href="./COMPLET.xml">
    </DOC>
    </MoDyCo>
    J'utilise la fonction document() pour traiter les données récupérées du fichier COMPLET.xml . Lorsque je l'utilise seule, je récupère bien ce que je veux, mais dès que j'y ajoute un autre modèle pour récupérer le nom d'un chercheur, les données censées être récupérer ne s'affiche plus dans le résultat.

    Pour plus de clareté,

    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
    <?xml version="1.0" encoding="utf-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" encoding="utf-8" />
     
    <xsl:template select="/">
    <xsl:apply-templates />
    </xsl:template>
     
    <xsl:template match="MoDyCo">
    	<xsl:for-each select="./chercheur">
    		<xsl:copy-of select="."/>
    	<xsl:call-template name="DOC"/>	
    	</xsl:for-each>
    </xsl:template>
     
    <xsl:template name="DOC">
       <xsl:apply-templates select="document(@href)" />
    </xsl:template>
     
       <xsl:template match="documents/typdoc/document">
          <xsl:for-each select="./auteur">
             <xsl:if test="contains(text(),'Cori')">
                <xsl:copy-of select="../child::*" />
             </xsl:if>
          </xsl:for-each>
        </xsl:template>
     
    </xsl:stylesheet>

    J'ai le nez dedans depuis trop longtemps, je ne vois vraiment pas où peut bien se situer le problème...

    Merci d'avance...

    Ludivine

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    tu fais un call-template vers une fonction nommée "DOC" alors que ce devrait être un apply-templates avec une sélection des éléments nommés "DOC". En conséquence, lorsque dans le template tu fais référence à l'attribut href, ce n'est pas celui de l'élément DOC qui remonte mais celui de l'élément courant, c'est à dire MoDyCo.

    Il faut bien faire la distinction entre templates « normaux » (avec un attribut match) et templates nommés (avec un attribut name), considérés comme des fonctions ; dans ces derniers il n'y a pas de changement de contexte, le noeud courant est celui qui l'était déjà au moment de l'appel du template.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 6
    Par défaut oups, désolée erreur de ma part
    Effectivement, call-templates n'était pas la bonne solution...je l'avais testé par désespoir de cause...

    mais l'apply-templates ne fonctionne pas non plus... Ce que je ne comprends quand même pas...

    En tout cas, merci pour cette première réponse qui m'a permis de comprendre call-template... et merci d'avance pour le reste...

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Je ne suis pas bien sûr d'avoir compris ce que tu cherche à faire exactement, et je n'ai pas toutes les infos (notamment la structure de COMPLET.xml), aussi la solution que je te propose n'est pas forcément exacte, mais tu peux en adapter le principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:template select="MoDyCo">
      <xsl:copy>
        <xsl:apply-templates select="chercheur" />
      </xsl:copy>
    </xsl:template>
     
    <xsl:template match="chercheur">
      <xsl:copy-of select="."/>
      <xsl:copy-of select="document(../DOC/@href)//documents/typdoc/document[contains(auteur, current())]/*" />
    </xsl:template>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 6
    Par défaut Merci
    Merci beaucoup...
    j'ai fini par réussir en faisant ainsi :

    <?xml version="1.0" encoding="utf-8" ?>
    <xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8"/>

    <xsl:template match="MoDyCo">
    <xsl:apply-templates select="chercheur"/>
    </xsl:template>

    <xsl:template match="chercheur">
    <xsl:for-each select="nom">
    <xsl:copy-of select="."/>
    <xsl:apply-templates select="../../DOC"/>
    </xsl:for-each>
    </xsl:template>

    <xsl:template match="DOC">
    <xsl:apply-templates select="document(@href)"/>
    <xsl:apply-templates select="documents/typdoc/document"/>
    </xsl:template>

    <xsl:template match="documents/typdoc/document">
    <xsl:for-each select="./auteur">
    <xsl:if test="contains(text(),'Cori')">
    <xsl:copy-of select="../child::*"/>
    </xsl:if>
    </xsl:for-each>
    </xsl:template>

    </xsl:stylesheet>

    J'aurais cependant une dernière (enfin j'espère) question. Peut-on imaginer créer une variable qui récupérerait dans la boucle for-each select="nom" la valeur de cette balise et que je puisse réutiliser à la fin de ma feuille, lorsque je teste if contains(text(),'Cori')" et qui remplacerait donc Cori...

    Je n'arrive pas à gérer ce genre de chose, ni avec xsl;variable, ni ave xsl:with-param (notions que je découvre)... et avant de m'acharner, j'aurais juste voulu savoir si c'était faisable ou pas du tout...

    Merci d'avance

Discussions similaires

  1. [VBA-E] Problème pour insérer des lignes dans une feuille Excel
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2007, 14h13
  2. [XSLT]problème d'appel de texte dans une balise à partir d'un attribut
    Par docteur chépère dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/01/2007, 10h57
  3. Réponses: 15
    Dernier message: 27/09/2006, 11h46
  4. pb eval pour le code php dans une feuille xslt
    Par nipepsi dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 10/09/2004, 11h23

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