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] Problème d'incrémentation


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Points : 17
    Points
    17
    Par défaut [XSL] Problème d'incrémentation
    Voici en gros ce que j'ai côté XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Personnes>
       <Personne Type="Adulte" Nombre="2"/>
       <Personne Type="Enfant" Nombre="5"/>
    </Personnes>
    et le XML que je doit obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Personne id="1" Type="ADULTE"/>
    <Personne id="2" Type="ADULTE"/>
    <Personne id="3" Type="ENFANT"/>
    <Personne id="4" Type="ENFANT"/>
    <Personne id="5" Type="ENFANT"/>
    <Personne id="6" Type="ENFANT"/>
    <Personne id="7" Type="ENFANT"/>
    En XSL, j'ai une fonction, enfin template :

    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
     
    <xsl:template name="for.loop.persons">
      <xsl:param name="start"/>
      <xsl:param name="total"/>
      <xsl:param name="Type"/>
     
      <xsl:if test="$start &lt;= $total">
    	<Personne>
              <xsl:attribute name="id">
                <xsl:value-of select="$start"/>
              </xsl:attribute>
              <xsl:attribute name="Type">
                <xsl:value-of select="$Type"/>
              </xsl:attribute>
            </Personne>
      </xsl:if>
     
      <xsl:if test="$start &lt;= $total">
        <xsl:call-template name="for.loop.persons">
          <xsl:with-param name="start">
            <!-- Increment index-->
    	<xsl:value-of select="$start + 1"/>
          </xsl:with-param>
          <xsl:with-param name="total">
    	<xsl:value-of select="$total"/>
          </xsl:with-param>
          <xsl:with-param name="Type">
    	<xsl:value-of select="$Type"/>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:if>
     
    </xsl:template>
    Et voilà l'endroit où je traite cela :

    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
     
    <xsl:template match="Voyage/Personnes">
      <xsl:for-each select="Personne">
        <xsl:call-template name="for.loop.persons">
          <xsl:with-param name="start">
            1
          </xsl:with-param>
          <xsl:with-param name="total">
            <xsl:value-of select="@Nombre"/>
          </xsl:with-param>
          <xsl:with-param name="Type">
            <xsl:for-each select="@Type">
    	  <xsl:value-of select="translate(.,$LowerLetters,$UpperLetters)"/>
    	</xsl:for-each>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:for-each>
    </xsl:template>
    Le problème est que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Personne id="1" Type="ADULTE"/>
    <Personne id="2" Type="ADULTE"/>
    <Personne id="1" Type="ENFANT"/>
    <Personne id="2" Type="ENFANT"/>
    <Personne id="3" Type="ENFANT"/>
    <Personne id="4" Type="ENFANT"/>
    <Personne id="5" Type="ENFANT"/>
    Je sais que c'est parceque je donne 1 en paramètre d'entrée de start, je sais que ça vient d'un mauvais passage de paramètres, mais j'ai essayé avec position(), en faisant des opérations du style position() + (position()-1) qui ne marche pas toujours....

    Bref, là je sature

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

    ton problème vient du fait que tu essayes de tout traiter en une seule fonction. Il t'en faut deux :
    - Une pour faire une itération sur tes éléments Personnes, et qui va gérer l'id par type de personne
    - Une autre pour générer chaque ligne de voyageur, en incrémentant l'id que lui a transmis la précédente fonction.

    Le nombre de voyageurs a générer et l'id doivent être traités dans des variables séparées.

    Ca donne ça :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<xsl:template match="/Personnes">
    		<voyage>
    			<xsl:call-template name="boucle">
    				<xsl:with-param name="voyageur" select="Personne[1]"/>
    			</xsl:call-template>	
    		</voyage>
    	</xsl:template>
     
    	<xsl:template name="boucle">
    		<xsl:param name="id" select="1"/>
    		<xsl:param name="voyageur"/>
    		<xsl:variable name="nombre" select="$voyageur/@Nombre"/>
    		<xsl:if test="$nombre != ''">
    			<xsl:call-template name="genere-voyageur">
    				<xsl:with-param name="id" select="$id"/>
    				<xsl:with-param name="nombre" select="$nombre"/>
    				<xsl:with-param name="type-voyageur" select="$voyageur/@Type"/>
    			</xsl:call-template>
    			<xsl:call-template name="boucle">
    				<xsl:with-param name="id" select="$id + $nombre"/>
    				<xsl:with-param name="voyageur" select="$voyageur/following-sibling::Personne[1]"/>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
     
    	<xsl:template name="genere-voyageur">
    		<xsl:param name="id"/>
    		<xsl:param name="nombre"/>
    		<xsl:param name="type-voyageur"/>
    		<xsl:if test="$nombre != 0">
    			<Personne>
    				<xsl:attribute name="Type"><xsl:value-of select="$type-voyageur"/></xsl:attribute>
    				<xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
    			</Personne>
    			<xsl:call-template name="genere-voyageur">
    				<xsl:with-param name="id" select="$id + 1"/>
    				<xsl:with-param name="nombre" select="$nombre - 1"/>
    				<xsl:with-param name="type-voyageur" select="$type-voyageur"/>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
     
    </xsl:stylesheet>

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    Ca marche merci beaucoup. C'est vraiment pas évident le XSL à coder quand on a l'habitude plus du C ou Java . Pfiouu...

  4. #4
    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
    Citation Envoyé par OXyGN
    Ca marche merci beaucoup. C'est vraiment pas évident le XSL à coder quand on a l'habitude plus du C ou Java . Pfiouu...
    Tu pourrais coder ces fonctions de la même manière en C ou en Java. Si ce n'est qu'avec ces langages l'usage de la récursivité est optionnel, tandis qu'avec XSLT c'est quasiment obligatoire.

    Ah, et n'oublie pas de mettre le tag [Résolu] avec le bouton qui va bien.

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

Discussions similaires

  1. Xsl problème d'affichage (code) [débutant]
    Par redsaint dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 01/06/2005, 17h02
  2. [XSL]problème avec <xsl:when>
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 27/05/2005, 16h54
  3. [html][xsl]Problème valeur attribut html
    Par beho dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 16/04/2005, 13h37
  4. [XSL] problème de syntaxe
    Par Flushovsky dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 14/03/2005, 22h06
  5. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34

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