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] Position d'un noeud


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut [XSLT] Position d'un noeud
    Bonjour à tous,

    fisrt time que je poste un message sur un forum, c'est vraiment que j'en ai besoin !

    Alors, j'ai un fichier XML qui comprend plusieurs champ : En voici un bout de la structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <champ id="Table1" genre="numerique">
               <eti num="1">
            <titre lang="fr">Oui</titre>
               </eti>
     </champ>
     <champ id="table2" genre="numerique">
             <eti num="1">
            <titre lang="fr">Oui</titre>
          </eti>
     </champ>

    et donc, dans mon fichier XSL, je veux afficher mes noms de champs accompagnés du "num" de l'étiquette. Je fais donc une concaténation qui fonctionne sans soucis.

    Pour traiter ces champs spéciaux ( ceux qui possèdent "une étiquette" ), je les mets dans une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      <xsl:template match="champ[@genre='numerique']/eti">
           `<xsl:value-of select="concat(../@id,'__',@num)"/>` VALEUR       <xsl:call-template name="Recursif"/>
        </xsl:template>
    AINSI, vient mon soucis. Je veux qu'à la derniere boucle sur les champs ( TOUS LES CHAMPS ), on me mette un espace blanc, et que si c'est pas le dernier, on me mette une virgule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      <xsl:template name="Recursif">
            <xsl:if test = "not(position()=last())">,
            </xsl:if><xsl:if test = "position()=last()">  </xsl:if>  
        </xsl:template>

    CEPENDANT, lorsque, je boucle sur <xsl:template match="champ[@genre='numerique']/eti">, et ben il me met tout le temps la virgule, même si c'est le dernier champ !!!!

    si quelqu'un aurait une idée ! ça ne sera pas de refus ! S'il vous plait, bien sur

    Ellia

  2. #2
    Membre Expert
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut
    Bonjour,

    tu peux écrire une règle récursive de la forme :

    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
    <xsl:template name="count">
      <xsl:param name="n" select="$N"/>
     
      <xsl:choose>
         <xsl:when test="$n = 0">
           <xsl:value-of select="$n"/>
         </xsl:when>
         <xsl:otherwise>
            <xsl:call-template name="count">
               <xsl:with-param name="n" select="$n -1"/>
            </xsl:call-template>
         </xsl:otherwise>
      </xsl:choose>
     
    </xsl:template>
    J'ai la flemme d'écrire une règle adapter à ton cas précis.
    Mais si tu n'y arrive pas, repost, je te l'écrirais.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ou alors 'faudrait que le template sur champ[@genre='numerique']/eti soit appelé par le fait d'une instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="champ[@genre='numerique']/eti"/>
    Pour que les position() et last() se basent sur la même chose que le template.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut
    Merci aux deux réponses.

    Cependant, je n'arrive tout de même pas à comprendre comment vous voulez faire ?!
    Car, à quel endroit je pourrais mettre mon : apply-template?

    Et polymorphisme, oui je veux bien que tu m'écrives selon mon cas stp !

  5. #5
    Membre Expert
    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
    Par défaut
    Citation Envoyé par Ellia Voir le message
    Car, à quel endroit je pourrais mettre mon : apply-template?
    Il y'a bien un endroit dans ton XSL où tu fais un <apply-templates/> ou <apply-templates select="champ"/>.

    C'est à cet endroit-là que tu pourrais désambigüer, tout en sachant que du coup l'ordre des champs ne sera pas conservé.

    On ne peut pas être plus précis sans avoir tout ton XSL sous les yeux.

  6. #6
    Membre averti
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut
    Merci pour ta réponse.


    Quand je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="//champ"/>
    , cela ne marche pas pour les "eti".

    donc j'ai essayé de faire ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="//champ/eti"/>
    , or celui fonctionne ( il m'enleve la virgule apres le dernier eti ), mais il m'applique pas pour les autres "champ" au dessus ( dans l'arbre) de eti.


    J'ai donc décidé de mettre les deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:apply-templates select="//champ"/> 
    <xsl:apply-templates select="//champ/eti"/>
    mais, en ce qui concerne les deux, ils m'execute deux fois ce qu'il y a dans eti, en m'enlevant la virgule à la fin.

    Mais comment faire ?

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Stop.

    Fais un petit fichier XSLT*qui traite ton fichier XML, et montre-le-nous en entier.
    C'est pas normal que tu ne saches pas ce qu'est apply-templates.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    ...ce que je veux. c'est à dire, quand tu arrives à la derniere eti, du DERNIER champ du fichier, tu ne me mets pas de VIRGULE
    Voici ce que vous pouvez faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      <!-- remplacé
      <xsl:template match="champ[@genre='numerique']/eti"> 
     `<xsl:value-of select="concat(../@id,'__',@num)"/>`     ID DU TYPE <xsl:call-template name="Recursif"/>
      </xsl:template>
      -->
      <xsl:template match="champ[@genre='numerique']"> 
     `<xsl:value-of select="concat(@id,'__',eti/@num)"/>`     ID DU TYPE <xsl:call-template name="Recursif"/>
      </xsl:template>

  9. #9
    Membre averti
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut
    Merci beaucoup. J'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <xsl:template match="champ[@genre='numerique']"> 
          <xsl:for-each select="eti"> 
              `<xsl:value-of select="concat(../@id,'__',@num)"/>` MON ID <xsl:call-template name="Recursif"/>
          </xsl:for-each>
            </xsl:template>
    et ça marche.

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

Discussions similaires

  1. XSLT - Trier/regrouper des noeuds en fonction de leur position
    Par Rackamm dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 10/03/2014, 15h58
  2. [XSLT] Obtenir la position d'un noeud
    Par zoubidaman dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/09/2006, 09h34
  3. [XSLT][VARIABLE] comment un noeud est-il stocké?
    Par Devotion dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 02/11/2004, 14h19
  4. position() relative au noeud courant
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 09/09/2004, 17h38
  5. [XSLT]position d'un element de valeur specifique
    Par squat dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/07/2002, 16h42

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