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 :

[Xpath] Tester si un noeud est le dernier fils d'un noeud donné


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Points : 78
    Points
    78
    Par défaut [Xpath] Tester si un noeud est le dernier fils d'un noeud donné
    Bonjour tous le monde, j'ai un soucis avec xslt/xpath, je ne connais pas beaucoup xslt et xpath.
    Voici le probleme que je rencontre que je vais illustrer par un petit exemple .

    voici mon xml exemple:

    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
    <math>
                            <mrow>
                                <mi>un</mi>
                                <mo>=</mo>
                                <mfrac>
                                    <mrow>
                                        <mo>(</mo>
                                        <mrow>
                                            <mi>deux</mi>
                                            <mo>+</mo>
                                            <mi>trois</mi>
                                        </mrow>
                                        <mo>)</mo>
                                    </mrow>
                                    <mrow>
                                        <mo>(</mo>
                                        <mrow>
                                            <mi>trois</mi>
                                            <mo>+</mo>
                                            <mi>trois</mi>
                                        </mrow>
                                        <mo>)</mo>
                                    </mrow>
                                </mfrac>
                            </mrow>
                        </math>
    Je vais parcourir chacun de ces noeuds et tester si le noeud est le dernier des fils du noeud mfrac( cd au-dessus en rouge). Mais mon teste ne marche pas correctement il detecte prend les 2 noeud fils de mfrac alors que je veux que mon teste ne detecte que le dernier.

    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
    <xsl:template match="/">
     
            <xsl:call-template name="mathml"/>
     
        </xsl:template>
     
        <xsl:template name ="mathml">
            <xsl:for-each select="/math/descendant::*">
     
                <xsl:if test="node()/descendant::*=//*[position()=2 and current()/parent::mfrac]/descendant::*">
                    <xsl:text>9/</xsl:text>
                </xsl:if>
     
     
                <xsl:if test="boolean(self::node()[position()=last()] and name(..)='mfrac')">
                    <xsl:text>1/</xsl:text>
                </xsl:if>
     
                <xsl:if test="name(..)='mfrac' and position()=last()">
                    <xsl:text>/</xsl:text>
                </xsl:if>
     
                <xsl:value-of select="."/>
     
            </xsl:for-each>
     
        </xsl:template>
    J'ai essayer 3 testes mais aucun ne marche correctement. HELP ME

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Points : 78
    Points
    78
    Par défaut
    Ben comme d'habitude ca fait pas mal de temps que je galére sur ce probleme est a peine aprés avoir posé la question je trouve la solution.
    Moi je dis ce forum est magique mdr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:if test="self::node()=//*[position()=2 and current()/parent::mfrac]">
                    <xsl:text>/</xsl:text>
    </xsl:if>

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    et ça, ça serait plus simple si tu ne souhaite pas vraiment le parcours en profondeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:for-each select="/math/*">
    <xsl:if test="position()=last()"></xsl:if>
    </xsl:for-each>

  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
    Bonjour,

    position() est à proscrire dans ce cas de figure, puisque la position est donnée parmi tous les descendants de math, pas uniquement parmi les fils de mfrac.

    Une solution simple, qui n'oblige pas à chaque itération de parcourir tout l'arbre... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:template name ="mathml">
     
            <xsl:for-each select="/math/descendant::*">
     
                <xsl:if test="parent::mfrac and not(following-sibling::mrow)">
                    <xsl:text>/</xsl:text>
                </xsl:if>
     
                <xsl:value-of select="."/>
     
            </xsl:for-each>
     
        </xsl:template>

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Points : 78
    Points
    78
    Par défaut
    En effet cette expression est bien mieux, merci beaucoup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:if test="parent::mfrac and not(following-sibling::*)">
                    <xsl:text>/</xsl:text>
    </xsl:if>

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

Discussions similaires

  1. [AJAX] xml tester si un noeud est vide
    Par Alex35 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/06/2007, 17h32
  2. [JDBC]tester si une table est vide
    Par zozolh2 dans le forum JDBC
    Réponses: 5
    Dernier message: 28/05/2004, 09h17
  3. [XSL] Tester si la valeur est un entier dans un xml
    Par MrMaze dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/07/2003, 04h35
  4. Tester si un champ est NULL
    Par titititi007 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2003, 10h17
  5. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54

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