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 :

Récupérer un noeud dans une variable


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut Récupérer un noeud dans une variable
    Bonjour,

    je débute toujours en XSL et ma question est, je pense, très simple.

    En fait j'ai un fichier XML qui ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <APPARTEMENT>
    <SURFACE>80</SURFACE>
    <NB_ETAGES>1</NB_ETAGES>
    <NB_PIECES>4</NB_PIECES>
    <NB_CHAMBRES>3</NB_CHAMBRES>
    </APPARTEMENT>
    Dans mon XSL je fais:
    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
     
    <xsl:if test="cml:APPARTEMENT">  << cml étant mon espace de nom que j'ai donné
    <xsl:choose>
                <xsl:when test="not ((cml:APPARTEMENT/cml:SURFACE = '') and (cml:APPARTEMENT/cml:SURFACE = 0))">
                  Terrain: <xsl:value-of select="cml:APPARTEMENT/cml:SURFACE_TERRAIN"/>
                </xsl:when>
                <xsl:otherwise>
                  Terrain: -
                </xsl:otherwise>
                </xsl:choose>
     
                <xsl:choose>
                <xsl:when test="not ((cml:APPARTEMENT/cml:NB_CHAMBRES = '') and (cml:APPARTEMENT/cml:NB_CHAMBRES = 0))">
                  Nb chambre: <xsl:value-of select="cml:APPARTEMENT/cml:NB_CHAMBRES"/>
                </xsl:when>
                <xsl:otherwise>
                  Nb chambre:-
                </xsl:otherwise>
                </xsl:choose>
    On voit que le noeud qui est renvoyé est "APPARTEMENT". Mais je peux recevoir le même fichier XML avec à la place du noeud APPARTEMENT, le noeud MAISON. JE n'ai pas envie de repartir avec un <xsl:if test="cml:MAISON">........

    J'aimerais me rapprocher de ceci (ATTENTION la syntaxe est inventée, c'est justement l'objet de ma question):
    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
    J récupère dans une variable le noeud (MAISON ou APPARTEMENT ou autre...)
    
    $TypeLogement = <xsl:value-of select="cml:APPARTEMENT"/>
    
    Ensuite je retire le IF que j'ai fait au début et j'écris:
    
    <xsl:choose>
                <xsl:when test="not (($TypeLogement/cml:SURFACE = '') and ($TypeLogement/cml:SURFACE = 0))">
                  Terrain: <xsl:value-of select="$TypeLogement/cml:SURFACE_TERRAIN"/>
                </xsl:when>
                <xsl:otherwise>
                  Terrain: -
                </xsl:otherwise>
                </xsl:choose>
    ...
    Est il possible de faire ce ci, et si oui, comment?

    Par avance, merci.

    Alex

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Oui, tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="logement" select="cml:APPARTEMENT | cml:MAISON"/>
    Ça consiste à mettre dans ta variable, tout ce qui est APPARTEMENT et tout ce qui est MAISON.
    Or, si ton document ne peut utiliser que l'un ou l'autre, mais pas les deux à la fois, au final, ça fera donc qu'il ne prendra que ce qu'il y a à prendre, et le mettra dans ta variable. Que tu peux alors traiter sans te soucier de son nom.

    En réalité, c'est comme si tu remplaçais tout le temps $logement par (cml:APPARTEMENT | cml:MAISON)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Si je comprends bien l'intention avec des expressions comme $TypeLogement/cml:SURFACE etc, la possibilité dépends drastiquement la version du support xslt. En xslt 2.0, c'est possible avec des fonctionalités de par la recommendation elle-même. En xslt 1.0, ce ne serait pas possible sauf faisant appel à des fonctions d'extension, normalement tout le monde définit comme ext:node-set() où ext soit le préfixe pour l'espace de nom selon les cas comme msxml, saxon, exslt, xt etc... Je propose alexking de google avec ces mots clés indiqués pour entamer les études supplémentaires sur le sujet précis.

    Si vous voulez contourner ces complications, vous pouvez travailler dans le cadre de xslt 1.0 (ou 2.0 egalement) par [1] tester l'existence de APPARTEMENT ou MAISON; selon les cas [2] définir une variable portant le nom local càd APPARTEMENT ou MAISON; et puis, [3] quand c'est nécessaire, utilser un *[local-name()='APPARTEMENT' and namespace-uri()='etc'] pour obtenir la flexibilité recherchée. Il est bien difficile pour moi de tout mettre en phrases déscriptives: c'est le plan au large.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut
    Merci thelvin et tsuji.

    Malheureuseusement je suis sincèrement désolé Tsuji mais je n'ai rien compris à ce que vous m'avez dit.

    thelvin, j'ai bien saisi, j'ai d'alleurs lu la doc sur le site w3school, toutefois j'ai un problème pourréutiliser ma variable. Si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:choose>
                <xsl:when test="not ((cml:$logement/cml:NB_CHAMBRES = '') and (cml:$logement/cml:NB_CHAMBRES = 0))">
                  Nb chambre<b><xsl:value-of select="cml:$logement/cml:NB_CHAMBRES"/>
                </xsl:when>
                <xsl:otherwise>
                  Nb chambre:-
                </xsl:otherwise>
                </xsl:choose>
    ça ne fonctionne pas. Comment puis je faire pour réutiliser logement?

    Merci.

    Alex

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par alexking2005 Voir le message
    j'ai d'alleurs lu la doc sur le site w3school
    Pour info, w3school c'est des guignols. Tout le monde te le dira à part, malheureusement, leur classement Google. J'ignore ce que tu es allé voir chez eux et à quel point ce qu'ils en disent est pourri, mais de manière générale, il ne faut pas aller les voir. Sauf si tu veux vraiment pas arriver à quelque chose.

    Sur quoi tu peux te baser, eh bien, ma foi, sur ce qui accompagne les tutoriels avec lesquels tu as commencé. Et puis sur des bons bouquins sur XSLT. Au pire, moi je me gêne pas pour consulter directement la recommandation XSLT 1.0 sur le W3C, en anglais ou en français.

    Citation Envoyé par alexking2005 Voir le message
    ça ne fonctionne pas. Comment puis je faire pour réutiliser logement?
    Pourquoi diable as-tu mis cml: devant le nom de ta variable ? C'est pour le nom des balises, ça, pas des variables.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Pourquoi diable as-tu mis cml: devant le nom de ta variable ? C'est pour le nom des balises, ça, pas des variables.
    En fait c'est un code qui a été développé par quelqu'un d'autre et je reprends la suite.

    Pour en revenir à ce que je voulais faire? Est il possible d'avoir la syntaxe?

    Merci

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par alexking2005 Voir le message
    Pour en revenir à ce que je voulais faire? Est il possible d'avoir la syntaxe?
    C'est celle que j'ai donnée, mais il ne faut pas mettre cml: devant $logement, ça n'a pas de sens.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Citation Envoyé par alexking2005 Voir le message
    Malheureuseusement je suis sincèrement désolé Tsuji mais je n'ai rien compris à ce que vous m'avez dit.
    D'accord, ce n'est pas grave. D'abord, c'est en partie à cause de ma maîtrise de la langue française, sans doute. Mais même je dirais dans ma langue première, je crains ce que j'ai dit, c'est très possible, ne soit pas tout à fait compris non plus. C'est un sujet un peu beaucoup avancé et si vous n'êtiez pas prêt, ça sonne mal.

    Et puis je ne veux pas mettre des propos très en détail pour éviter des malentendus comme si j'ai eu quelque chose contre l'autre réponse vous avez reçue. Mais comme vous n'avez rien compris, je dis simplement cette fois ci que c'est impossible de le faire en xslt 1.0 sans extension propriétaire pourtant librement disponible au grand public d'après les logicielles différentes, cas par cas.

    En pratique pour vous faire avancer, faites une recherche en google avec le mot clé comme "node-set()". Voilà ce que je peux dire d'une manière la plus simple possible.

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

Discussions similaires

  1. Récupérer les header dans une variable
    Par alex.hitman dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2007, 18h18
  2. récupérer contenu fichier dans une variable
    Par kalyparker dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 02/07/2007, 18h10
  3. [XSL] Stocker un jeu de noeud dans une variable
    Par Blustuff dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 22/06/2007, 13h01
  4. [XSLT]mettre un noeud dans une variable
    Par Morbo dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 15/06/2007, 21h28
  5. Stocker un noeud dans une variable
    Par Devotion dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 23/09/2004, 17h02

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