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 :

[XSL] Comment créer un XPATH dynamique en XSL?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut [XSL] Comment créer un XPATH dynamique en XSL?
    Bonjour à tous,

    J'ai chercher sur le net pour trouver le moyen de créer un XPATH en fonction de paramètre mais je n'ai rien trouvé de convaincant.

    En gros j'essais d'avoir un formulaire dynamique.
    Mais expérimente quelques petits soucis quand je veux remplir les champs dans le formulaire de retour en cas de mauvaise saisie.

    Mon problème principale c'est que je crée une variable $responseURL à partir d'une concaténation de bout d'XPATH et j'aimerais tester si cet XPATH existe et si oui quel est sa valeur.
    Mais apparemment XLS n'interprete pas cette variable en me renvois toujours la valeur du text du XPATH (ex: /RESPONSE/URL/nom) et pas la valeur qui se trouve à cette adresse. (Y a-t-il une fonction de convertion de String vers Node ?)

    Voici le morceau de code qui me pose problème:

    XSL

    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
    ...
    <!-- TEXTBOX -->
    <xsl:when test="$mediaCurr/INFO/MEDIATYPE='TextBox'">
    <xsl:variable name="responseField" select="$mediaCurr/DESCRIPTIONS/DESCRIPTION/URL" />
    <xsl:variable name="responseURL" select="concat('/RESPONSE/URL/',$responseField)"/> <!-- probleme: variable initialisée comme string --><tr>
    <td width="120">
    <xsl:value-of select="$mediaCurr/DESCRIPTIONS/DESCRIPTION/HEADER"/>
    </td>
    <td align="left">
    <input type="text" size="30" maxlength="256" name="{$responseField}">
    <xsl:if test="$responseURL and $responseURL=''">
    <xsl:attribute name="style">background-color: #8d94c9;color: #FFFFFF;</xsl:attribute>
    </xsl:if> 
    <xsl:attribute name="value">
    <xsl:choose>
    <xsl:when test="$responseURL = ''">
    <xsl:value-of select="''" />										
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$responseURL" />
    </xsl:otherwise>
    </xsl:choose> -->
    </xsl:attribute>							
    </input>
    </td>
    </tr>
    </xsl:when>
    ...
    XML

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     <RESPONSE>
     <URL>
      <nom>Olivier</nom> 
      <societe>Ma société</societe>
      <tel>0266......</tel>
      </URL>
    ...
     <MEDIA depth="4" ID="67">
     <INFO>
      <ID>67</ID> 
      <ACTIVITY>1</ACTIVITY> 
      <ISLOCKED>0</ISLOCKED> 
      <CREATORID>1990</CREATORID> 
      <OWNERID>1990</OWNERID> 
      <GROUPID>0</GROUPID> 
      <MODIFIERID>1976</MODIFIERID> 
      <CREATIONDATE>2006-11-21 16:39:40</CREATIONDATE> 
      <MODIFICATIONDATE>2006-12-05 19:24:50</MODIFICATIONDATE> 
      <MEDIATYPEID>14</MEDIATYPEID> 
      <MEDIATYPE>TextBox</MEDIATYPE> 
      <DENOMINATION>Nom</DENOMINATION> 
      <PAGETOCALL /> 
      <TEMPLATE /> 
      <TIMEIN>0000-00-00 00:00:00</TIMEIN> 
      <TIMEOUT>9999-12-31 23:59:59</TIMEOUT> 
      <EVENTSTART>0000-00-00 00:00:00</EVENTSTART> 
      <EVENTEND>9999-12-31 23:59:59</EVENTEND> 
      <AUTHORID>0</AUTHORID> 
      <PUBLISHED>1</PUBLISHED> 
      <CHECKED>0</CHECKED> 
      <MISC /> 
      </INFO>
     <DESCRIPTIONS>
     <DESCRIPTION ID="6965">
      <ID>6965</ID> 
      <LANGUAGEID>fre</LANGUAGEID> 
      <STATUS>published</STATUS> 
      <CREATORID>0</CREATORID> 
      <MODIFIERID>1976</MODIFIERID> 
      <URL>nom</URL> 
     <HEADER>
     <CSS>
      <p>Nom</p> 
      </CSS>
      </HEADER>
      <TITLE>Nom</TITLE> 
      <CUSTOM /> 
      <BODY /> 
      <SUMMARY /> 
      <SIGNATURE /> 
      <BIBLIO /> 
      <COPYRIGHT /> 
      </DESCRIPTION>
      </DESCRIPTIONS>
      <CATEGORIES /> 
      <DEPINFO /> 
      <COMMENT /> 
      </MEDIA>
    ...
    </RESPONSE>
    Désolé, si je n'ai pas été assez clair, c'est mon premier post.
    Si vous pouvez m'aider, sutout n'hésitez pas à me poser des questions sur ce qui n'est pas clair.

    Merci d'avance...

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    bienvenue sur le forum :

    simplement en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="responseURL" select="concat(../RESPONSE/URL/,$responseField)"/>
    en gros enleve les quotes '

  3. #3
    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 : 48
    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
    sauf que... une string ne peut pas être interpréter comme un xpath en xslt or les passages de paramètres(généralement) et les fonctions concat(toujours) sont des string.
    Donc tu pourras produire un xpath tout a fait correct mais il ne sera jamais interprété e tant que tel (et ce n'est même pas prévu en xslt 2.0),la seule solution est d'utilisé des extensions du processeurs (si elles existent)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Merci de votre aide mais rien à changé ça ne marche toujours pas...

    La solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="responseURL" select="concat(../RESPONSE/URL/,$responseField)/>"
    ne compile pas, les cotes semblent nécéssaires. (PS: J'ai essayé sans les .. qui ne me semblaient pas requis, même résultat)

    De plus, je suis très étonné de d'entendre qu'il n'y a pas moyen de créer un XPATH construit dynamiquement.

    Pour récapituler, tout ce que j'essais de faire c'est un chemin par rapport à une partie fixe "/RESPONSE/URL/" et une partie variable qui est contenue dans mon XML à l'adresse "/RESPONSE/MEDIA/DESCRIPTIONS/DESCRIPTION/URL" (Qui peut contenir: 'nom', 'societe', 'tel', ...) .
    Exemple de XPATH possible resultat: "/RESPONSE/URL/nom".
    Une fois ceci fait, je dois vérifier si ce chemin existe et si oui afficher le contenu.

    Si vous avez une idée pour gérer ceci, même de manière différente, je suis prenneur.
    Merci encore.

  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 : 48
    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
    Citation Envoyé par oliviercuyp
    Une fois ceci fait, je dois vérifier si ce chemin existe et si oui afficher le contenu.
    Comme dit, ce n'est pas possible en xslt pur, il faut donc utiliser les (possibles) extensions du processeur XSLT (la il faudra nous donner celui que tu utilises) , il peut y avoir d'autres methodes assez complexes (construire le xpath et faire la selection en dehors du xslt puis la passer en paramètre) mais c'est aussi sur des cas assez spécifiques et cela depend encore des processeur (certains n'acceptent pas de selections de noeuds en paramètres)

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    il y a toujours la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ../RESPONSE/URL/*[name()=$responseField]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Je suis très déçu de me retrouver devant un language si limité.
    J'espèrais que c'était moi qui n'avais pas bien compris la philosphie XSL.
    Mais je me rend compte que ce n'est malheureusement qu'un language figé qui ne propose pas une façon alternative de penser.
    Merci de votre support.

  8. #8
    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 : 48
    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
    Citation Envoyé par oliviercuyp
    Je suis très déçu de me retrouver devant un language si limité.
    J'espèrais que c'était moi qui n'avais pas bien compris la philosphie XSL.
    Mais je me rend compte que ce n'est malheureusement qu'un language figé qui ne propose pas une façon alternative de penser.
    Merci de votre support.
    C'est une question de point de vue.
    Personnellement, par expérience sur d'autre forum de DVP, le pb principale de XSLT est que justement il oblige à une façon de penser alternative ainsi que de "concevoir" un environnement dans lequel il s'insère, au lieu d'aller à la va-comme-je-te-pousse avec les solutions de y-aura-toujours-une-librairie-qui-me-permettra-n'importe-quelles-excentricités.
    Etrangement, par exemple, bien qu'utilisant largement les technos xml , je ne suis jamais tombés sur un cas ou un xpath dynamique était utile et non contournable autrement que dans une approche conceptuelle "tordue" (pour être aimable). Cela doit bien sur exister, mais pas avec la fréquence à laquelle revient cette question sur ce forum.

    Si tu expliquais le but que tu poursuis on pourrait voir si cela tient bien du vice de conception (ce qui y ressemble) ou d'un réel problème.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Merci, trop cool la solution !

    Ca faisait plus de 3 jours qu'il me manquait juste cette partie pour finir un site.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /RESPONSE/URL/*[name()=$responseField]
    Encore MERCI, c'est exactement ce que je cherchais.

  10. #10
    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
    Si ton processeur XSLT l'implémente, il y a l'extension dyn:evaluate()...

    Je suis totalement d'accord avec Erwy, les problèmes concrets qui ne peuvent être résolus que par l'évaluation dynamique d'une expression XPath sont extrêmement rares... D'ailleurs, personnellement, après plusieurs années d'expérience de XSLT, je n'en ai encore rencontré aucun.

  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 : 48
    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

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par Erwy
    C'est une question de point de vue.
    Personnellement, par expérience sur d'autre forum de DVP, le pb principale de XSLT est que justement il oblige à une façon de penser alternative ainsi que de "concevoir" un environnement dans lequel il s'insère, au lieu d'aller à la va-comme-je-te-pousse avec les solutions de y-aura-toujours-une-librairie-qui-me-permettra-n'importe-quelles-excentricités.
    Etrangement, par exemple, bien qu'utilisant largement les technos xml , je ne suis jamais tombés sur un cas ou un xpath dynamique était utile et non contournable autrement que dans une approche conceptuelle "tordue" (pour être aimable). Cela doit bien sur exister, mais pas avec la fréquence à laquelle revient cette question sur ce forum.

    Si tu expliquais le but que tu poursuis on pourrait voir si cela tient bien du vice de conception (ce qui y ressemble) ou d'un réel problème.
    Vraiment désolé, mais quand j'ai commencé à faire le post précédent j'étais vraiment désespéré et la réponse de SWOOG n'était pas encore la... (on a du éditer en même tps quasi). Enfait il ne fallait pas plus que ça. Je chercherai plus en profondeur dans le forum la prochaine fois, j'ai pas du utiliser les bons critères de recherche. Merci du temps que vous avez consacré à mon problème.

  13. #13
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    juste pour dire que je fait de nombreux projet avec des échanges de fichiers xml et la première chose que je demande est la dtd ou le schema des fichiers. j'ai essayer de faire des choses dynamiques mais à la finale on se rend compte que d'être 100% dynamique cela implique plus de test (donc un temp de traitement plus long) et plus de bug. On ne devrait jamais donner un fichier xml sans sa dtd
    (a mon avis)
    @+

  14. #14
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    Citation Envoyé par valal
    bienvenue sur le forum :

    simplement en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="responseURL" select="concat(../RESPONSE/URL/,$responseField)"/>
    en gros enleve les quotes '

    valal est un gros boulet. ..à vouloir repondre sans réflechir.... merci Erwy d'avoir corrigé cette bourde.

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

Discussions similaires

  1. Comment créer un tableau dynamique ?
    Par khokho dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/08/2007, 09h40
  2. Réponses: 6
    Dernier message: 04/08/2007, 15h17
  3. [reports] comment créer une requete dynamiquement
    Par lifeisgood dans le forum Reports
    Réponses: 4
    Dernier message: 31/01/2007, 13h15
  4. [DisplayTag] Comment créer un lien dynamique
    Par tscoops dans le forum Taglibs
    Réponses: 3
    Dernier message: 17/02/2005, 10h53

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