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 :

Comment tester un attribut dans un for-each? [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Bricoleur
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Bricoleur

    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Points : 61
    Points
    61
    Par défaut Comment tester un attribut dans un for-each?
    Bonjour,
    Voilà un extrait de mon fichier XML
    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
     
    <AA>
     <M desc="modalités">
       <m value="a" desc="solo">
       <m value="b" desc="en équipe">
       ...
     </M>
     <CS>
       <C>
          <M a="1" b="0" c="1" ...>
          <V a="test'/>
          <desc>
               <desc_fr>ceci est un test</desc_fr>
               <desc_en>this is a test</desc_en>
          </desc>
       </C>
       ...
      </CS>
    </AA>
    la transformation 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    ...
    <xsl:variable name="modalite" select="AA/M"/>
     
    <xsl:for-each select="AA/CS/C">
     
    <xsl:variable name="carte" select="."/>
    <xsl:variable name="encours" select="position()"/>
     
    <!-- formulaire -->
    <xsl:element name="form">
    	<xsl:attribute name="action">#</xsl:attribute>
    	<xsl:attribute name="class"></xsl:attribute>
    	<xsl:attribute name="name">frm_<xsl:value-of select="$encours"/></xsl:attribute>
    	<xsl:attribute name="id">frm_<xsl:value-of select="$encours"/></xsl:attribute>
     
    	<xsl:for-each select="$modalite/m">
    		<xsl:element name="label">
    		<xsl:attribute name="class"></xsl:attribute>
    		<xsl:attribute name="for">mod_<xsl:value-of select="$encours"/>_<xsl:value-of select="position()"/></xsl:attribute>
    		<xsl:value-of select="@desc"/>
    		</xsl:element>
     
    		<xsl:element name="input">
    		<xsl:attribute name="class"></xsl:attribute>
    		<xsl:attribute name="type">checkbox</xsl:attribute>
    		<xsl:attribute name="name">mod_<xsl:value-of select="$encours"/></xsl:attribute>
    		<xsl:attribute name="id">mod_<xsl:value-of select="$encours"/>_<xsl:value-of select="position()"/></xsl:attribute>
    		<xsl:attribute name="value"><xsl:value-of select="@val"/></xsl:attribute>
    		<xsl:variable name="valeur"><xsl:value-of select="string(@val)"/></xsl:variable>
    		<xsl:if test="Quel test???"><!-- Est-ce un test if qu'il faut faire? -->
    			<xsl:attribute name="checked">checked</xsl:attribute>
    		</xsl:if>
    		</xsl:element>
    	</xsl:for-each>
     
    </xsl:element>
    ...
    </xsl:for-each>

    Ce que je souhaite obtenir
    Pour chaque <C> je produis un formulaire (jusque là ça va)
    Dans chaque formulaire il y a un groupe de case à cocher reprenant tous les <m>, ça aussi ça fonctionne.
    Par contre, j'aimerai que si dans C/M/@un_attribut cette valeur est égale à 1, la case à cocher correspondante dans le formulaire ait l'attribut checked="checked".
    J'ai fait un xsl:if test=C/M/@chaque_attribut and string(@val)=l_attribut_en_question qui fonctionne, mais j'aimerai faire un truc qui permette de tester un nombre quelconque d'attributs, genre une boucle avec une variable, mais là, je bloque, si vous pouviez éclairer ma lanterne.
    Merci

  2. #2
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Un test qui devrait marcher (j'ai pas testé) dans ton cas serait celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:variable name="sel" select="M"/> <!-- On parle du "M" de AA/CS/C -->
    <xsl:for-each select="$modalite/m">
      <!-- ... -->
      <xsl:if test="$sel/@*[local-name() = current()/@value] = 1">
      </xsl:if>
      <!-- ... -->
    </xsl:for-each>
    Une conception plus "jolie" serait celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     <CS>
       <C>
          <Ms>
            <check val="a"/>
            <check val="c"/>
          </Ms>
          <V a="test'/>
          <desc>
               <desc_fr>ceci est un test</desc_fr>
               <desc_en>this is a test</desc_en>
          </desc>
       </C>
       ...
      </CS>
    Ce qui donnerait un test du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:variable name="sel" select="Ms"/>
    <xsl:for-each select="$modalite/m">
      <!-- ... -->
      <xsl:if test="$sel/check[@val=current()/@value]">
      </xsl:if>
      <!-- ... -->
    </xsl:for-each>
    Ok, le code XSL n'est pas si différent que ça, mais ça permet de ne pas passer par un "local-name()" de l'attribut (ce qui est relativement moche) et d'avoir un XML plus propre.

  3. #3
    Membre du Club
    Profil pro
    Bricoleur
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Bricoleur

    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Points : 61
    Points
    61
    Par défaut
    Super merci,
    ça fonctionne à merveille
    Par contre je ne comprends pas pourquoi l'utilisation de local-name n'est pas "joli"

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Citation Envoyé par CBresso Voir le message
    Par contre je ne comprends pas pourquoi l'utilisation de local-name n'est pas "joli"
    ... Parce que c'est un appel de fonction d'introspection au lieu d'une construction littérale, ce qui en fait une expression à la fois plus longue et plus compliquée ?

    Accessoirement, l'usage de local-name() tout seul casse la notion de namespaces. Ce n'est pas forcément un problème, du moment qu'on s'en rappelle le jour où on se met à mettre des namespaces.

  5. #5
    Membre du Club
    Profil pro
    Bricoleur
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Bricoleur

    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Points : 61
    Points
    61
    Par défaut
    Bon, je vais me pencher sur la regex pour modifier mon fichier XML

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

Discussions similaires

  1. [XPATH] Récupèrer la "row" précédente dans le for each
    Par tommey dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 05/06/2007, 15h59
  2. [XSLT][débutant] Problème xsl:value-of dans xsl:for-each
    Par Choubie dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/05/2007, 16h30
  3. [XSLT] Element parent dans un For-each
    Par Katachana dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/04/2007, 09h39
  4. [XSLT] Number dans un for-each
    Par stepd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/08/2006, 13h40
  5. [XML-XPATH] Problème dans un for each
    Par stailer dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/12/2005, 12h11

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