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 :

[Débutant] [XSLT] Deux attributs au même niveau?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué Avatar de VinnieMc
    Inscrit en
    Décembre 2005
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 208
    Points : 161
    Points
    161
    Par défaut [Débutant] [XSLT] Deux attributs au même niveau?
    Bonjour, j'ai deux fichiers XML:

    Fichier1
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet href="Template.xsl" type="text/xsl"?>
     
    <texte>
       <phrase nb=1>
    Ceci est un très bon
    <nomCand>
             <obPT Verbe="null"
    		terminaison="ment"/>
    	<mot>développement</mot>
    </nomCand>
    .
    </phrase>
       <phrase nb=2>
    La première
    <nomCand>
             <obPT Verbe="null"
    		terminaison="tion"/>
    	<mot>formation</mot>
    </nomCand>
    de ce genre.
    </phrase>
    </texte>
    Fichier2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <lex>
    <verbe>former</verbe>
    <verbe>développer</verbe>
    <verbe>changer</verbe>
    <verbe>entrer</verbe>
    </lex>
    Mon but est de copier le fichier1 en mettant à jour l'attribut "Verbe" de la manière suivante:
    1- je regarde si l'attribut "terminaison" est égale à "ment"
    2- si oui, je récupère la substring de la chaîne de caractère entre <mot></mot> sans le "ment", ici "développe", et je regarde si dans Fichier2 il y a une entrée <verbe><verbe> qui contient (avec contains) la "substring", si oui
    3- je met la valeur de l'entrée <verbe></verbe> correspondante, ici "développer", à la place de "null" à l'attribut "Verbe" du Fichier1.
    4-si non, je laisse la valeur "null".

    Voici mes feuilles xsl:

    Identity.xsl (elle recopie fichier1):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method = "xml" encoding="UTF-8" indent='yes'/>
     
      <xsl:template match="node()|@*">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    Template.xsl (qui importe Identity.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
     
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:import href="Identity.xsl"/>
     
     
      <xsl:template match="@Verbe">
      <xsl:choose>
      <xsl:when test="@terminaison='ment'">
      <xsl:if test= "contains(document('fichier2.xml')//verbe,substring(texte/phrase/nomCand/mot,1,index-of(texte/phrase/nomCand/mot,'ment')-1))">
         <xsl:attribute name="Verbe">
           <xsl:value-of select="replace(.,'null',document('fichier2.xml')//verbe)"/>
         </xsl:attribute>
    </xsl:if>
      </xsl:when>
      <xsl:otherwise>
         <xsl:attribute name="Verbe">
           <xsl:value-of select="."/>
         </xsl:attribute>
      </xsl:otherwise>
    </xsl:choose>
      </xsl:template>
    </xsl:stylesheet>
    J'aimerais rendre à César ce qui lui appartient, en disant que "Identity.xsl" et une partie de "Template.xsl" proviennent de http://www.dpawson.co.uk/xsl/sect2/i....html#d6349e43.

    J'obtiens ce type d'erreur " The child axis starting at an attribute() node will never select anything", apparement (comme dit dans le titre) cela est dû au fait que les attributs "Verbe" et "terminaison" sont sur le même niveau.

    A l'aide

  2. #2
    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 : 47
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test= "contains(document('fichier2.xml')//verbe,substring(texte/phrase/nomCand/mot,1,index-of(texte/phrase/nomCand/mot,'ment')-1))">
    9a déjà ca me semble faux, cela ne testera que le premier verbe il faut une structure du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:for-each select="document('fichier2.xml')//verbe">
    <xsl:if test= "contains(.,substring(texte/phrase/nomCand/mot,1,index-of(texte/phrase/nomCand/mot,'ment')-1))">
         .....
    </xsl:for-each>
    et je n'ai pas reagrdé en détail.
    Pour toutes les fonctions concernant des chaines en xpath, si on passe en paramètre un XPATH donnant comme résultat plusieurs noeuds, la fonction ne s'effectuera que sur le premier

  3. #3
    Membre habitué Avatar de VinnieMc
    Inscrit en
    Décembre 2005
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 208
    Points : 161
    Points
    161
    Par défaut
    Merci, en effet ça fait déjà une erreur de réglée, sinon, je pense que c'est cette ligne (fichier Template.xsl):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      <xsl:template match="@Verbe">
    qui interdit celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      <xsl:when test="@terminaison='ment'">

  4. #4
    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 : 47
    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 VinnieMc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      <xsl:when test="@terminaison='ment'">
    Oui, il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      <xsl:when test="../@terminaison='ment'">

  5. #5
    Membre habitué Avatar de VinnieMc
    Inscrit en
    Décembre 2005
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 208
    Points : 161
    Points
    161
    Par défaut
    Salut Erwy et merci pour toute ton aide, ta dernière réponse m'a énormément aidé, voici ma nouvelle feuille Template.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
    29
    30
     
     <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:import href="Identity.xsl"/>
     
    <xsl:template match="@Verbe">
    <xsl:for-each select="../@terminaison">
      <xsl:choose>
      <xsl:when test="../@terminaison='ment'">
    <!-- si la terminaison est 'ment', oui pour le premier 'développement' -->
      <xsl:for-each select="document('fichier2.xml')//verbe">
    <!-- Pour chaque verbe -->
      <xsl:if test= "contains(.,substring(texte/phrase/nomCand/mot,1,index-of((texte/phrase/nomCand/mot),'ment')-1))">
    <!-- On regarde si le verbe contient le mot amputé de sa terminaison, c-â-d ici, si "développer" contient "développe", ce qui est le cas.-->
         <xsl:attribute name="Verbe">
    <!-- On met alors la valeur de "verbe"(avec une minuscule) ici, "développer" à l'attribut "Verbe (avec majuscule)"-->
           <xsl:value-of select="."/>
         </xsl:attribute>
    </xsl:if>
    </xsl:for-each>
      </xsl:when>
      <xsl:otherwise>
    <!--Si non on garde la valeur d'origine 'null' -->
         <xsl:attribute name="Verbe">
           <xsl:value-of select="../@Verbe"/>
         </xsl:attribute>
      </xsl:otherwise>
    </xsl:choose>
    </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    Le problème est qu' il me met toujours la valeur du dernier verbe du fichier2, c'est à dire "entrer", je ne sais pas pourquoi.
    voici la sortie:

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet href="Template.xsl" type="text/xsl"?><texte>
       <phrase nb="1">
    Ceci est un très bon
    <nomCand>
             <obPT Verbe="entrer" terminaison="ment"/>
    	        <mot>développement</mot>
          </nomCand>
    .
    </phrase>
       <phrase nb="2">
    La première
    <nomCand>
             <obPT Verbe="null" terminaison="tion"/>
    	        <mot>formation</mot>
          </nomCand>
    de ce genre.
    </phrase>
     
    </texte>

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 21
    Points
    21
    Par défaut
    La boucle for-each :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="../@terminaison"> ... </foreach>
    est superflue.

    Il vaut mieux, avant de changer de contexte vers le fichier2.xml, de suvegarder le mot dans une variable.

    Voilà ce que je propose :

    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
     
    <xsl:template match="@Verbe">
               <xsl:choose>
                    <xsl:when test="../@terminaison='ment'">
                        <xsl:variable name="mot" select="substring(../../mot,1,string-length(../../mot)-4)"/>
                        <!-- si la terminaison est 'ment', oui pour le premier 'développement' -->
                        <xsl:choose>
                            <xsl:when test="document('fichier2.xml')//verbe[contains(.,$mot)]">
                                <xsl:attribute name="Verbe">
                                    <!-- On met alors la valeur de "verbe"(avec une minuscule) ici, "développer" à l'attribut "Verbe (avec majuscule)"-->
                                    <xsl:value-of select="document('fichier2.xml')//verbe[contains(.,$mot)]"/>
                                </xsl:attribute>
                            </xsl:when>
                            <xsl:otherwise>
                                <!-- et si le verbe n'est pas dans la liste ? -->
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:when>
                    <xsl:otherwise>
                        <!--Si non on garde la valeur d'origine 'null' -->
                        <xsl:attribute name="Verbe">
                            <xsl:value-of select="."/>
                        </xsl:attribute>
                    </xsl:otherwise>
                </xsl:choose>
        </xsl:template>

  7. #7
    Membre habitué Avatar de VinnieMc
    Inscrit en
    Décembre 2005
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 208
    Points : 161
    Points
    161
    Par défaut
    Merci infiniment Bouffa , apparemment mon problème est résolu, en attendant d'en être sûr, je ne mets pas le Tag résolu. Mais promis je ne l'oublierai pas.

Discussions similaires

  1. clé d'un Map formée par deux attributs
    Par kass28 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 14/05/2014, 09h18
  2. [XSLT] comment comparér la valeur de deux attributs
    Par subuntug dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 15/10/2009, 18h56
  3. [ xslt ] iteration attribut
    Par hocinema dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 29/08/2007, 20h37
  4. [XSD] Dépendance entre deux attributs
    Par boux2 dans le forum Valider
    Réponses: 1
    Dernier message: 12/12/2006, 14h51
  5. Clé primaire à deux attributs, comment incrémenter?
    Par ben53 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 28/07/2005, 11h32

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