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] [PHP 5] fonction position()


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut [XSLT] [PHP 5] fonction position()
    Bonjour

    Je suis en train de monter un site basé sur XML/XSL. Le mécanisme marche parfaitement bien avec le moteur XSLT de Microsoft. J'exécute en faite dynamiquement l'association de plusieurs XSL sur 1 seul fichier XML coté serveur.

    Maintenant je veux rendre compatible mon développement en faisant la même chose simplement en utilisant un processus de transformation (toujours coté serveur) avec le moteur XSLT intégré à PHP 5 (extension php_xsl).

    En théorie je ne dois changer que le fichier qui contenait du code ASP par du code PHP mais je ne devrait pas avoir à toucher les XSL. Et ça marche sauf que le processeur XSLT du PHP ne me renvoit pas les mêmes indices de position de tags avec la fonction XSL position() :

    1. Ça c'est mon XML :

    <ROOT>
    <MENU> ... </MENU>
    <MENU>... </MENU>
    </ROOT>

    2. ça c'est le test XSL :

    <xsl:template match="MENU">
    <xsl:if test="position() = $posMenu">

    3. Le problème est :

    Avec le moteur XSLT microsoft, la fonction position() me renvoit 1 et 2 pour les tags <MENU> : normal je pense.
    Avec le moteur XSLT PHP 5, la fonction position() me renvoit 2 et 4 ?????

    Quelqu'un pourait m'éclairer la lanterne ou bien m'indiquer vers où je pourrait trouver plus d'info ???

    Merci

  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,

    comment est rédigé l'attribut select du xsl:apply-templates qui fait appel au template de <menu> ?
    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
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut
    Merci de de me répondre !!

    En fait c'est basique ( je ne met pas tous les tags, pour voir l'essentiel !)

    Il n'y a pas de sélection au template qui appel le template MENU.

    <xsl:tempate match="/">

    <body>
    <xsl:apply-templates/>
    </body>

    </xsl:template>

    <xsl:template match="MENU">

    De plus, le match MENU est le seul template, je veux dire qu'il n'y aucun autre appel vers d'autres template !!

    Tout ce que je fais, c'est retrouver le bon noeud <MENU> en filtrant grace à position() et ensuite j'explore mon menu pour sortir tellle ou telle info !

    Mon problème est que je ne sais pas sous quelle roche est l'anguille !
    Est ce moteur MSXML2 (pour ASP) ?
    Ou bien le moteur XSLTProcessor (pour PHP) ?

  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
    Le problème vient de ton <xsl:apply-templates/>. Par cette commande, tu sélectionne tous les noeuds enfants de la racine dans une liste, puis le template correspondant à chaque noeud de cette liste est exécuté. position() renvoie l'index du noeud courant dans cette liste.

    MSXML et PHP ont une différence de traitement pour les noeuds textes ne contenant que des espaces (ou caractères considérés comme des espaces par la spécification XML) ; MSXML ne les prend pas en compte, PHP si. Donc la liste de noeuds sélectionnés par PHP contiendra 5 noeuds (le noeud contenant le saut de ligne juste après <ROOT>, le premier <MENU>, le noeud contenant le saut de ligne juste après le premier <MENU>, le second <MENU>, le noeud contenant le saut de ligne juste après le second <MENU>), tandis que la liste sélectionnée par MSXML contiendra (le premier <MENU>, le second <MENU>). On voit bien que dans la première liste que les <MENU> ont les index 2 et 4, tandis qu'ils ont les index 1 et 2 dans la première. D'où le problème.

    La solution la plus simple est de sélectionner explicitement les <MENU>, et eux seuls :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="MENU"/>
    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
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut
    Merci Grand Father !!!

    C'est exactement ça !

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

Discussions similaires

  1. [XSLT 1.0] XSLT: utilisation de la fonction position() dans <for-each> imbriqués
    Par bernidupont dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/05/2011, 21h33
  2. [XSLT 1.0] PHP/XSLT et la fonction *xsl:include*
    Par khand dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 14/02/2011, 12h00
  3. [XSLT] [PHP] executer une fonction PHP lors de la transformation
    Par Mo_Poly dans le forum XSL/XSLT/XPATH
    Réponses: 16
    Dernier message: 01/10/2009, 10h34
  4. [XSLT] Utiliser une fonction PHP à partir de la feuille de style XSL
    Par sayou84 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 25/04/2007, 13h35
  5. [XSLT] fonction position()
    Par Raumfahrerralf dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/03/2007, 18h01

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