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 comparaison de variable non nulle et nulle


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut XSL comparaison de variable non nulle et nulle
    Bonjour,

    J'ai un petit problème technique lors de la comparaison de variables nulles avec des variables non nulles.

    <xsl:when test="$start_am != $prev_start_am">

    Lorsque je réalise ce test, si l'une des variables est nulle et son homologue non nulle, le parser considère que le test vaut faux. Or si l'une des variables n'est pas renseignées (en provenance d'attributs XML), je souhaite passer à la suite du traitement.

    J'ai beau chercher un quelconque moyen de réaqliser cela, je ne m'en sors pas...

    Ma manière de récupérer le contenu des variables :
    <xsl:with-param name="start_am" select="day[@order = $order + 1]/schedule-time[@type='AM']/@start"/>
    <xsl:with-param name="prev_start_am" select="day[@order = $order]/schedule-time[@type='AM']/@start"/>

    Quelqu'un pour m'aider?
    Merci.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 612
    Points
    21 612
    Par défaut
    Marrant, j'ai mis un moment avant de comprendre ce qui se passe. Dans ce cas très précis, la syntaxe est contre-intuitive.

    Tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="not($start_am = $prev_start_am)">
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="string($start_am) != string($prev_start_am)">
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:with-param name="start_am" select="string(day[@order = $order + 1]/schedule-time[@type='AM']/@start)"/>
    <xsl:with-param name="prev_start_am" select="string(day[@order = $order]/schedule-time[@type='AM']/@start)"/>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse.
    J'ai utilisé la solution du not, qui a l'air de fonctionner. Je vais pousser un peu plus mes tests.

    Merci

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 612
    Points
    21 612
    Par défaut
    Je me rends compte que je devrais peut-être expliquer pourquoi.

    - Le paramètre test est évalué comme une expression xpath. (Si cette expression n'est pas booléenne, on passe implicitement son résultat par la fonction boolean() pour qu'elle le devienne. Nous allons voir que dans le cas qui nous intéresse, elle est booléenne.)

    - Les opérateurs = et != produisent des booléens. Les règles de calcul dépendent des types des opérandes.

    - Tes deux paramètres sont des expressions d'ensembles de nœuds. Ça n'a pas d'importance, mais en les regardant on peut voir que les nœuds sont forcément des attributs. On peut aussi supposer que ça ne sélectionne, soit qu'un seul attribut, soit aucun attribut. Donc probablement des ensembles, soit d'un seul nœud, soit de zéro nœud.

    - Sur des ensembles de nœud, les opérateurs = et != sont définis ainsi :
    -- la condition est vraie si et seulement si, il existe une paire de nœuds, un nœud tiré de la première opérande et l'autre de la deuxième opérande, telle que, les résultats de la fonction string() sur ces nœuds, vérifie la condition suscitée.
    Autrement dit, pour $a != $b, il s'agit de trouver deux nœuds, un tiré de $a et un tiré de $b, tels que string() sur celui de $a != string() sur celui de $b.
    -- On en conclut que contre-intuitivement, si on n'a pas $a = $b, on n'a pas forcément non plus $a != $b. Ni l'inverse.
    -- On en conclut aussi que si un est opérande est l'ensemble vide, la condition est forcément fausse. Autrement dit l'ensemble vide n'est égal à rien, et n'est différent de rien. Chose amusante, l'ensemble vide n'est pas égal à l'ensemble vide.

    Comment marchent les corrections ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="not($start_am = $prev_start_am)">
    Ici il s'agit de tester si les deux ensembles vérifient l'opérateur =, et de prendre l'inverse du résultat. Je trouve que c'est ce que devrait faire l'opérateur !=, mais ce n'est pas ce qu'il fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="string($start_am) != string($prev_start_am)">
    En passant les opérandes par string() d'abord, on convertir leur type. Ce ne sont plus des ensembles de nœuds, ce sont des chaînes de caractères. Pour l'ensemble vide c'est la chaîne vide, pour les autres c'est la valeur de string() sur le premier nœud.
    Et les opérateurs = et != sur des opérandes chaînes de caractères sont beaucoup plus intuitifs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 51
    Points
    51
    Par défaut
    Merci Thelvin pour les explications. Ce genre de comparaison m´intéresse également. J´ai une autre question, j´aimerais choisir rien que les noeuds Class de mon XML qui ont un noeud-enfant nommé SuperClass.
    <Root>
    <Class id="A88">Class A88
    <SubClass code="A88.0"/>
    <SubClass code="A88.1"/>
    </Class>
    <Class id="A88.0">Class AB
    <SuperClass code="A88"/>
    <SubClass code="A88.01"/>
    </Class>
    <Class id="A88.1"><nom>Class AC</nom>
    <SuperClass code="A88"/>
    <SubClass code="A88.11"/>
    </Class>
    </Root>

    Pour cela j´écris:
    <xsl:template match="Root">
    <xsl:for-each select="Class[not(SuperClass/@code=' ')]">
    Mais, j´obtiens une sélection de toutes les classes existantes, même celles qui n´ont pas de noeud-enfant SuperClass.

    Pourrais-tu stp m´aider à obtenir la bonne sélection? Merci pour toute aide.

    Sylvie

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 612
    Points
    21 612
    Par défaut
    <xsl:for-each select="Class[not(SuperClass/@code=' ')]">
    Mais, j´obtiens une sélection de toutes les classes existantes, même celles qui n´ont pas de noeud-enfant SuperClass.
    Ben... C'est à peu près ce que tu demandes. "Toutes les classes qui n'ont pas un enfant SuperClasse dont le code est un espace." A priori aucune de tes classes n'a d'enfant SuperClasse dont le code est un espace, donc on les prend toutes.
    C'est juste de l'algèbre, hein -_-°.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="Class[SuperClass]">
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par thelvin Voir le message
    C'est juste de l'algèbre, hein -_-°.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="Class[SuperClass]">
    Super Thelvin, ca marche. Merci.
    Sylvie

Discussions similaires

  1. Récupérer variables non nulles
    Par Ludix_ dans le forum SAS Base
    Réponses: 5
    Dernier message: 06/12/2011, 15h58
  2. erreur: usage non valide du null
    Par Pau dans le forum Access
    Réponses: 2
    Dernier message: 28/04/2006, 10h41
  3. Réponses: 3
    Dernier message: 14/03/2006, 14h43
  4. [Sécurité] variable de session à NULL, pourquoi?
    Par cladsam dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2006, 18h04
  5. [CR 9] Mise en forme non affichée when null
    Par Yorglaa dans le forum Formules
    Réponses: 2
    Dernier message: 28/06/2004, 17h27

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