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 :

Concaténer les valeurs d'un même XPath [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut Concaténer les valeurs d'un même XPath
    Bonsoir / Bonjour,

    j'ai un fichier XML avec la structure suivante
    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
    <Article>
        <Id>4046</Id>
        <name>Pop Up Petit prince - Nouvelle version</name>
        <itemgroupid>01</itemgroupid>
        <name>Livre</name>
        <Auteur>
          <AuteurId>2162</AuteurId>
          <Prenom>Antoine</Prenom>
          <Libelle>de Saint-Exupéry</Libelle>
          <NumAuteur>1</NumAuteur>
        </Auteur>
        <Auteur>
          <AuteurId>12878</AuteurId>
          <Prenom>Levi</Prenom>
          <Libelle>Henriksen</Libelle>
          <NumAuteur>1</NumAuteur>
        </Auteur>
    </Article>
    Le but est de concaténer les prénom / noms des différent auteur en les séparant d'un " - ".
    J'ai une solution, mais je donc prévoir le nombre maximum de cas.
    Existe-t-il une structure de boucle pour faire la meme chose ?

    mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <COL><DATA><xsl:value-of select="concat(./Auteur[1]/Prenom,' ',./Auteur[1]/Libelle)" />
    <xsl:if test="./Auteur[2]/NumAuteur > 0 ">  
    <xsl:value-of select="concat(' - ',./Auteur[2]/Prenom,' ',./Auteur[2]/Libelle)" />
    </xsl:if> 
    <xsl:if test="./Auteur[3]/NumAuteur > 0 ">  
    <xsl:value-of select="concat(' - ',./Auteur[3]/Prenom,' ',./Auteur[3]/Libelle)" />
     </xsl:if> 
    <xsl:if test="./Auteur[4]/NumAuteur > 0 ">  
    <xsl:value-of select="concat(' - ',./Auteur[4]/Prenom,' </xsl:if></DATA></COL>
    Merci par avance pour votre aide !

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    ? Il suffit de faire tous ces value-of dans un for-each... Il n'y en avait pas dans tes tutoriels XSLT ?

  3. #3
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    J'ai effectivement pensé a une structure for-each.

    Mais ce que je ne sais pas faire, c'est que je sépare les cas par " - " a partir du deuxieme.

    En gros avec le for each que j'ai fait j'obtiens

    - Prenom Libelle - Prenom Libelle - Prenom Libelle
    C'est bon, SAUF le - du debut.

    Il faudrait donc que je fasse un for each a partir du second, et là j'avoue que j'atteins les limites de ma tutoriellisation

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Oh en effet, pardon.
    Ouais, c'est l'éternel problème de la boucle avec séparateurs au milieu. Il n'y a pas de syntaxe prévue pour, mais on peut mettre une condition "si c'est pas le premier" dans la boucle, comme pour un autre langage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:for-each select="Auteur">
      <xsl:if test="position() > 1">
        <xsl:text> - </xsl:text>
      </xsl:if>
      <xsl:value-of select="concat(Prenom, ' ', Libelle)"/>
    </xsl:for-each>
    Autre possibilité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:template match="Article">
      <xsl:apply-templates select="Auteur[1]"/>
      <xsl:for-each select="Auteur[position() > 1]">
        <xsl:text> - </xsl:text>
        <xsl:apply-templates select="."/>
      </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="Auteur">
      <xsl:value-of select="concat(Prenom, ' ', Libelle)"/>
    </xsl:template>

  5. #5
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    super ! ça fonctionne nickel.

    Merci pour ce bout de code que j'ai pu décliner à ma guise.

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

Discussions similaires

  1. Concaténer les valeurs de plusieurs champs
    Par papa6 dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/07/2009, 14h12
  2. Concaténer les valeurs dans une boucle
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2007, 21h08
  3. moyenne sur les valeurs d'un même tableau
    Par DelphLaga dans le forum Langage
    Réponses: 12
    Dernier message: 25/09/2006, 12h35
  4. Réponses: 2
    Dernier message: 14/09/2006, 00h18
  5. comparer les valeurs d'un même tableau
    Par DelphLaga dans le forum Langage
    Réponses: 11
    Dernier message: 19/07/2006, 15h32

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