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 ] probleme avec generate-id()


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Pi2
    Pi2 est déconnecté
    Membre actif

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 134
    Points : 234
    Points
    234
    Par défaut [ XSLT ] probleme avec generate-id()
    Bonjour,
    j'utilise la methode generate-id() a deux endroits differents dans ma feuille de style. En premier lieu, j'utilise la methode avec, en parametre, un chemin absolu specifiant un noeud donne. ca me genere un id. En deuxieme lieu, j'appelle a nouveau la methode generate-id mais sans parametre, donc sur le noeud courant qui est celui specifie precedemment par mon chemin absolu. ca me genere un id different! Pourquoi donc?
    Merci.
    Pi2.

  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,

    parce que ce doit être deux noeuds différents...

    generate-id() est prévu justement pour, dans la même session de transformation, renvoyer le même ID. Donc, de deux choses l'une, soit il y a une erreur dans ton code, soit la fonction est boguée. Je te suggère de poster le code impliqué afin de trancher entre ces deux possibilités.
    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
    Pi2
    Pi2 est déconnecté
    Membre actif

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 134
    Points : 234
    Points
    234
    Par défaut
    Voila le bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:for-each select="*">
       <xsl:variable name="path">
             <xsl:value-of select="/modif/changes/@basePath" />
       </xsl:variable>
     
       <xsl:variable name="pathId">
           <xsl:value-of select="generate-id($path)" />
       </xsl:variable>
     
       <xsl:if test="(generate-id(.) = $pathId)">
              <xsl:call-template name="add_block" />
       </xsl:if>
    </xsl:for-each>
    A chaque boucle, la valeur de $pathId est bien la meme mais n'est jamais egale a celle du noeud courant ou nous sommes meme losrque la valeur de $path correspond au noeud courant! Voila mon probleme...

  4. #4
    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
    Il y a une petite confusion : xsl:value-of renvoie une chaîne, ta variable $path contient donc une chaîne (en fait un Result Tree Fragment, mais le résultat est le même). Or, generate-id() prend en argument un NodeSet, soit une liste de noeuds. C'est pour cela qu'ils renvoient des résultats différents. Essaie plutôt l'écriture suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:for-each select="*">
       <xsl:variable name="path" select="/modif/changes/@basePath" />
       <xsl:variable name="pathId" select="generate-id($path)" />
       <xsl:if test="(generate-id(.) = $pathId)">
              <xsl:call-template name="add_block" />
       </xsl:if>
    </xsl:for-each>
    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
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    meme avec la modif de grandfather( ) il reste un deuxieme probleme
    Ca ne peut pas être le meme noeud.
    Ta premier variable est sur un attribut
    /@basePath
    ton for-eachsur un noeud "normal"
    select="*"
    Pour atteindre un noeud "attribut" , cela aurait été @* les generate-id() seront donc forcement different

  6. #6
    Pi2
    Pi2 est déconnecté
    Membre actif

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 134
    Points : 234
    Points
    234
    Par défaut
    oui, oui, je comprends! En fait, la valeur de mon attribut basePath contient une chaine de caracteres qui represente le chemin absolu du noeud qui m'interesse. Comment faire donc?
    Pi2

  7. #7
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    le xslt n'interprete pas les chaines de caracteres en Xpath.
    On peut , dans certains xslt processeur, avoir cette fonction, mais dans le principe ton idée n'est pas génial
    Tu travaille sous quoi ?

  8. #8
    Pi2
    Pi2 est déconnecté
    Membre actif

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 134
    Points : 234
    Points
    234
    Par défaut
    je travaille avec xalan.

    Mon idee n'est pas geniale, ca je n'en doute pas! :-) Pourrais-tu me dire qu'elle idee tu aurais pour faire la chose suivante:

    j'ai une jsp qui contient un tag a moi dont le but est de modifier un fichier xml donne et deja existant par ailleurs. Ce bout de code java (l'implem de mon tag jsp) se contente de parser le fichier xml, d'y ajouter de l'info supplementaire (notamment le fameux /modif/changes/@basePath permettant de retrouver le noeud a modifier) et envoie le tout a ma feuille xsl generique qui se contente de recopier le fichier de depart (sans recopier l'info ajoutee par mon tag jsp) et de modifier le noeud specifie. Mon probleme etait donc de savoir, dans la feuille de style, le noeud a modifier.
    J'avais donc eu l'idee d'utiliser la methode generate-id, me disant qu'a partir du chemin absolu, je pouvais generer l'id du noeud et, qu'ensuite, pour chaque noeud, je testais l'egalite des id... Mais je faisais une erreur en croyant qu'un node-set pouvait etre une chaine de caractere interpretee comme un xpath...ca je l'ai bien compris maintenant. :-)

    bref, comment ferais-tu dans ce cas?
    Merci beaucoup deja pour vos reponses qui m'ont bien eclairee!

  9. #9
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Tu pourrais par exemple cree un attribut id avec un id unique pour tous tes noeuds ainsi le @basePath pourrait être simplkement l'id du noeud a modifié

  10. #10
    Pi2
    Pi2 est déconnecté
    Membre actif

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 134
    Points : 234
    Points
    234
    Par défaut
    oui dans l'absolu mais le probleme avec l'attribut id est:
    1. ca complexifie et augmente la taille de mon fichier xml de depart avec des attributs id pour chaque noeud sans autre interet que programmatique pour une de mes feuilles xsl (celle qui sert a la modification). Et du coup, on se retrouve avec des dependances de l'un vers l'autre et reciproquement: ma feuille xsl ne s'applique plus a n'importe quel fichier xml et reciproquement. On perd donc en genericite. Or, les chemins absolus contiennent en eux-memes assez d'info. mais bon, ce n'est pas une raison suffisante, ok.

    2. ca oblige le developpeur de jsp (qui se sert de mon tag jsp) a connaitre le fichier xml qu'il veut modifier pour pouvoir aller chercher l'id en question etc. or, ce fichier xml est lui-meme generer ailleurs par mon servlet et, par consequent, lorsque la personne cree la jsp en utilisant mon tag, le fichier xml n'existe pas encore...
    La solution serait donc d'utiliser un id qui ait pour valeur le chemin absolu...
    et je trouve ca un peu redondant....

  11. #11
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Faudrait voir si xalan reconnait et sait exploiter les xlink
    http://www.w3.org/TR/2001/REC-xlink-20010627/

    Cette recommendation a un peu été crée pour ça

  12. #12
    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
    ll devrait être plus simple (et moins coûteux en ressources) d'utiliser DOM pour charger le XML, puis les fonctions XPath de Xalan pour retrouver le noeud à modifier. La modification elle-même s'opérera avec l'API DOM, il n'y a ensuite plus qu'à séraliser le résultat.

    Passer par une transformation XSLT me paraît être de la grosse artillerie (parsing du XML et de la feuille de style, transformation, séralisation...) pour une opération qui semble assez simple...
    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

  13. #13
    Pi2
    Pi2 est déconnecté
    Membre actif

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 134
    Points : 234
    Points
    234
    Par défaut
    oui, en effet. Excellente reponse. Ici, nous sommes tous des fous-furieux d'xsl et on a tendance a en abuser...
    Merci beaucoup pour vos reponses!
    Pi2.

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

Discussions similaires

  1. [XSLT] probleme avec les doublons dans une liste deroulante
    Par mikooo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/04/2007, 15h37
  2. [XSLT] problème avec apply-templates
    Par ploxien dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 01/11/2006, 11h20
  3. [XSLT] problème avec copy-of
    Par ploxien dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 17/10/2006, 14h03
  4. [XSLT] probleme avec if et variable
    Par jaktok dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/08/2006, 00h13
  5. [XSLT]Problème avec un if
    Par stepd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/07/2006, 08h25

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