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 :

[XSL] tag incrémenté


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 131
    Points : 82
    Points
    82
    Par défaut [XSL] tag incrémenté
    Bonjour,

    Je dois utiliser un fichier XML qui possède des tag incrémentés, c'est à dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <Formdata>
          <_count_creator-multiple_creators>2</_count_creator-multiple_creators>
          <cln>A</cln>
          <cln_1>B</cln_1>
          <cln_2>C</cln_2>
          <creator_first_name>Aurelie</creator_first_name>
          <creator_first_name_1>Benoit</creator_first_name_1>
          <creator_first_name_2>Claude</creator_first_name_2>      
    </Formdata>
    Et je dois les mettre sous ce format là

    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
    <creator>
     <role>Photographe</role>
     <agent>
      <name>A</name>
      <firstname>Aurélie</firstname>
     </agent>
    </creator>
    <creator>
     <role>Photographe</role>
     <agent>
      <name>B</name>
      <firstname>Benoit</firstname>
     </agent>
    </creator>
    <creator>
     <role>Photographe</role>
     <agent>
      <name>C</name>
      <firstname>Claude</firstname>
     </agent>
    </creator>
    J'arrive à lire les données de <cln_i> grâce à un starts-with,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="*[starts-with(local-name(),'cln_')]"/>
    mais je n'arrive pas à faire une boucle sur le cln_i et comme i peut-être ne n'importe quelle valeur, je suis bien embêtée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                   <xsl:for-each select="starts-with('cln_',.)">
    Si quelqu'un peut éclairer ma lanterne... merci beaucoup.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    A priori pas besoin de boucler.
    Voici un exemple d'XSL pour t'inspirer
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" encoding="ISO-8859-1" indent="yes"/>
     
    <xsl:template match="Formdata">
    <xsl:apply-templates/>
    </xsl:template>
     
    <xsl:template match="_count_creator-multiple_creators"/>
     
    <xsl:template match="cln|creator_first_name">
    <p><b><xsl:value-of select="."/></b></p>
    </xsl:template>
     
    <xsl:template name="t_cln">
    <xsl:param name="txt"/>
    <xsl:choose>
    <xsl:when test="contains($txt,'_')"><xsl:call-template name="t_cln"><xsl:with-param name="txt" select="substring-after($txt,'_')"/></xsl:call-template></xsl:when>
    <xsl:when test="string-length($txt)=0">0</xsl:when>
    <xsl:otherwise><xsl:value-of select="$txt"/></xsl:otherwise>
    </xsl:choose>
    </xsl:template>
     
    <xsl:template match="*[starts-with(name(),'cln_')]">
    <p><xsl:value-of select="."/> #<xsl:call-template name="t_cln"><xsl:with-param name="txt" select="local-name()"/></xsl:call-template></p>
    </xsl:template>
     
    <xsl:template match="*[starts-with(name(),'creator_first_name_')]">
    <p><xsl:value-of select="."/> - <xsl:value-of select="local-name()"/></p>
    </xsl:template>
     
    </xsl:stylesheet>

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 131
    Points : 82
    Points
    82
    Par défaut
    ah d'accord. Merci je regarde ça dès que possible.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 131
    Points : 82
    Points
    82
    Par défaut
    Bon, j'y suis presque. J'ai beaucoup bossé à partir de ton code et en cherchant encore ailleurs et j'obtiens ça pour la partie récursive

    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="*[starts-with(local-name(),'cln_')]">
        <xsl:variable name="num" select="substring-after(name(),'cln_')"/>
        <xsl:variable name="last_name" select="concat('cln_',$num)"/>
        <xsl:variable name="first_name" select="concat('creator_first_name_',$num)"/>
                    <Creator>
                      <Role>
                        <Name>
                          <xsl:text>Photographe</xsl:text>
                        </Name>
                      </Role>
                      <Agent xsi:type="mpeg7:PersonType">
                        <Name>
                          <GivenName>
                            <xsl:value-of select="//*[local-name()=$last_name]"/>
                          </GivenName>
                        </Name>
                        <Name>
                          <FirstName>
                             <xsl:value-of select="//*[local-name()=$first_name]"/>
                          </FirstName>
                        </Name>
                      </Agent>
                    </Creator>
      </xsl:template>
    Cependant si la partie rouge a très bien fonctionné dans une page html, elle ne fonctionne pas dans une page xml. Je me demande bien pourquoi. Que signifie les avant le local-name par exemple ?

    merci beaucoup

Discussions similaires

  1. [XSLT] copy - xsl:element ou tag manuel
    Par Louis-Guillaume Morand dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 12/03/2007, 09h38
  2. [XSL~FO][FOP] variables possibles dans les attributs de tags ?
    Par lebechen dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 29/06/2006, 09h17
  3. [XSL] première apparition de la valeur d'un tag
    Par Milouse dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/07/2005, 11h17
  4. [XSL] Problème d'incrémentation
    Par OXyGN dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 28/01/2005, 12h48
  5. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19

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