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 :

[XSLT 2.0] Boucler sur la valeur d'un attribut


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut [XSLT 2.0] Boucler sur la valeur d'un attribut
    Bonjour à tous

    Voici ma source XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <method name="MaMethode">
      <field type="int" name="trotinette"/>
      <field type="float" name="mouton" count="3"/>
      <field type="char" name="banane" count="2"/>
    </method>
    Et voici ce que je veux en faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct MaMethode
    {
      int trotinette; //trotinette_0 est accepté
     
      float mouton_0;
      float mouton_1;
      float mouton_2;
     
      char banane_0;
      char banane_1;
    }
    Il s'agit, vous l'aurez compris, de faire la génération automatique de code en C. J'ai bien réussi à obtenir à peu près le bon résultat avec une <xsl:function/> récursive, mais je trouve ça trop bourrin et j'aimerai bien trouver qqchose de plus élégant.

    J'ai vu qu'avec XPath 2.0 on peut faire des choses genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:for-each select="field">
      <xsl:for-each select="for $i in ( 1 to @count )">
        <!-- 
         Dans la boucle, je peux récuperer la position courant avec position(),
         mais du coup je n'ai plus accès aux attributs de mon noeud car la séquence
         que j'ai construite avec le 'for' ne les contient pas
        -->
      </xsl:for-each>
    </xsl:for-each>
    Merci d'avance pour toute solution.

    PS : question subsidiaire, en XPath 2.0, "@count" quand 'count' n'existe pas s'évalue t'il à un booleen 'false', à un entier '0' ou à une chaine vide "" ? Ou tout cela en même temps ? Je crois que je ne suis pas encore au point sur le typage XSLT/XPath

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Je me réponds (partiellement) à moi même. Je suis toujours sur la source XML décrite dans mon premier post.

    J'ai finalement utilisé quelque chose qui s'approche du résultat souhaité:
    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
    <!-- Cas où @count existe -->
    <xsl:for-each select="field[number(@count)&gt;1]">
      <xsl:for-each select="for $i in ( 1 to @count ) return .">  
        <!-- A chaque tour de boucle, je peux accéder à la position courante 
        avec la fonction position(). L'itération en XPath crée une séquence de 
        @count fois l'élement field courant-->
        <xsl:value-of select="@type"/> my_<xsl_value_of select="@name">_<xsl:value-of select="position()"/>;
      </xsl:for-each>
    </xsl:for-each>
     
    <!-- Cas où @count n'est pas défini -->
    <xsl:for-each select="field[number(@count)=1]">
      <xsl:value-of select="@type"/> my_<xsl_value_of select="@name">;
     
    </xsl:for-each>
    Cela fonctionne, mais je ne peux m'empêcher de noter que
    1. Le code est presque doublonné selon que @count existe ou pas. Diffile à maintenir.
    2. Le test 'number(@count)!=1' est pour le moins douteux et j'ai même l'impression qu'il ne s'évalue pas de la même façon selon les versions de Saxon. Il faut trouver mieux.


    Voilà, je suis à l'écoute de toute proposition !

    Merci

  3. #3
    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,

    pour dissocier les deux cas, autant se reposer sur le pattern matching offert par XSLT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!-- Cas où @count existe -->
    <xsl:template match="field[@count]">
      <xsl:for-each select="for $i in ( 1 to @count ) return .">  
        <!-- A chaque tour de boucle, je peux accéder à la position courante 
        avec la fonction position(). L'itération en XPath crée une séquence de 
        @count fois l'élement field courant-->
        <xsl:value-of select="@type"/> my_<xsl_value_of select="@name">_<xsl:value-of select="position()"/>;
      </xsl:for-each>
    </xsl:template>
     
    <!-- Cas où @count n'est pas défini -->
    <xsl:template select="field">
      <xsl:value-of select="@type"/> my_<xsl_value_of select="@name">;
     </xsl:template>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/04/2015, 16h39
  2. [XCode] Mettre un breakpoint sur la valeur d'un attribut
    Par Kaki_ dans le forum Objective-C
    Réponses: 1
    Dernier message: 12/12/2014, 00h00
  3. [XSLT] Selectionner une balise selon la valeur de son attribut
    Par Monkon dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 03/09/2009, 17h03
  4. Filtrer sur une valeur d'un attribut XPATH
    Par jbnoel dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/01/2008, 10h00
  5. Boucler sur une table pour renommer des valeurs
    Par webwhisky dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/01/2006, 14h19

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