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 :

Impossible de modifier une variable


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Points : 67
    Points
    67
    Par défaut Impossible de modifier une variable
    Bonjour les amis,
    J’ai une liste des cartes.
    J’essai d’afficher deux cartes par ligne.
    Jusqu'à maintenant c’est bon.
    Voila mon programme qui marche
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <cardInfo>
     
    	<cards>
    		<card id="111111111"/>
    		<card id="222222222"/>
    		<card id="3333333"/>
    		<card id="4444444444444"/>
    		<card id="5555555555"/>
    		<card id="666"/>
    		<card id="77777777777"/>
    		<card id="888"/>
    		<card id="9999"/>
    	</cards>
    </cardInfo>
    XSL:
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    	<xsl:output indent="yes"/>
    	<xsl:output encoding="ISO-8859-1"/>
    	<xsl:template match="cardInfo">
     
    		<cards>
     
    			<xsl:variable name="C" select="count(cards/@card)"/>
    			<xsl:for-each select="cards/card">
    				<xsl:variable name="CardValue" select="@id"/>
    				<xsl:variable name="P" select="position()"/>
    				<xsl:choose>
    					<xsl:when test="($P) mod 2 = 1 and  $P = $C">
     
    							<LineNumber>
    								<xsl:value-of select="$P"/>
    							</LineNumber>
    							<Text>
    								<xsl:value-of select="$CardValue"/>
    							</Text>
    					</xsl:when>
    					<xsl:when test="($P) mod 2=0">
    						<xsl:variable name="CardValue2">
    							<xsl:for-each select="//cards/card">
    								<xsl:variable name="P2" select="position()"/>
    								<xsl:if test="($P2)=(($P)-1)or ($P2)=($P)">
    									<xsl:value-of select="concat(@id, '-')"/>
    								</xsl:if>
    							</xsl:for-each>
    						</xsl:variable>
    						<LineNumber>
    							<xsl:value-of select="$P"/>
    						</LineNumber>
    						<Text>
    							<xsl:value-of select="$CardValue2"/>
    						</Text>
    					</xsl:when>
    					<xsl:otherwise/>
    				</xsl:choose>
    			</xsl:for-each>
    		</cards>
    	</xsl:template>
    </xsl:stylesheet>
    cependant mon problème est quand la concaténation de deux ID est supérieur à 20 caractères, je ne dois pas insérer deux cartes par ligne, d'où le problème.
    j'arrive à faire la même chose en java, voila un exemple du code java qui marche mais le problème en XSL, je ne peux pas modifier une variable que j'ai déclarée .
    code java :
    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
    48
    49
    50
    51
    52
    53
    public class PositionTest {
     
      private static String[] arrayOfString = {"card1111", "card2", "card3", "card444444", "card5",
              "card6", "card7", "card888888", "card9"};
      /**
       * @param args
       */
      public static void main(String[] args) {
          System.out.println("length arrayOfString = "+arrayOfString.length);
          int postionL1 = 0;
          int postionL2 = 1;
          String resGlobal = "";
          int lineNumber = 0;
          while (postionL1 <= arrayOfString.length-1) {
     
              String res = "";
              System.out.println("positionL2 "+postionL2+" positionL1 = "+postionL1);
     
    //          l'algorithme est la suivante :
    //              1. si la longueur de deux est supérieur à 10 donc
              String l1 = arrayOfString[postionL1];
              String l2 = "";
              if (postionL1 < arrayOfString.length-1){
                  l2 = arrayOfString[postionL2];    
              }
              if (l1.length() + l2.length() <= 10){
                  lineNumber = incrementValue(lineNumber, 1);
                  res += l1 + (l2.length()!= 0?" - ":"")+l2+" \n";
                  postionL1 = incrementValue(postionL1, 2);
                  postionL2 = incrementValue(postionL2, 2);
    
              }else {
                  lineNumber = incrementValue(lineNumber, 1);
                  res += l1 + " \n";
                  postionL1 = incrementValue(postionL1, 1);
                  postionL2 = incrementValue(postionL2, 1);
              }
              
              System.out.println(lineNumber+ " : " +res);
    
    
              resGlobal +=res;
    
          }
          System.out.println(resGlobal);
    
      }
      private static int incrementValue(int value, int incrementValue){
          value = value+incrementValue;
          return value;
      }
    
    }
    quelqu'un peut m'aider à corriger mon code XSL.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Points : 67
    Points
    67
    Par défaut
    J’ai essayé autre chose, mais el problème reste le même
    J’ai définit deux cartes.
    Carte1 : quand la position du curseur est $P (P=position())
    Carte2 : quand la position du curseur est $P+1
    Si Carte1+Carte2 est supérieur à 20
    J’insère carte1 avec la position P
    Si non si la somme est inferieur à 20
    J’insère carte1+Carte2. D’où mon problème je dois modifier la valeur de la variable position pour qu’il saute la position ($P+1) par ce que je déjà insérer la Carte2.
    Comment je peux faire ? ou pouvez vous me proposer une idée différente.
    Merci pour votre aide

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Un truc genre

    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
    <template name="insert-cards">
      <param name="next-position">
      <param name="next-line-number">
      [Code qui insère une une deux cartes,
      et appelle à nouveau le template insert-cards
      avec les paramètres vers la prochaine position
      et le prochain numéro de ligne]
    </template>
     
    <template match="/">
      <cards>
        <call-template name="insert-cards">
          <with-param name="next-position" select="1"/>
          <with-param name="next-line-number" select="1"/>
        </call-template>
      </cards>
    </template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Un truc genre

    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
    <template name="insert-cards">
      <param name="next-position">
      <param name="next-line-number">
      [Code qui insère une une deux cartes,
      et appelle à nouveau le template insert-cards
      avec les paramètres vers la prochaine position
      et le prochain numéro de ligne]
    </template>
     
    <template match="/">
      <cards>
        <call-template name="insert-cards">
          <with-param name="next-position" select="1"/>
          <with-param name="next-line-number" select="1"/>
        </call-template>
      </cards>
    </template>
    merci thelvin, mais je ne pense pas avoir bien compris.
    en fin tu veux que j'appelle une fonction de façon récursive ? c'est ça?
    si oui cela ne résout pas mon problème, du fait que dés fois j'insère une carte et d'autre deux.
    faut savoir également que le nombres des cartes est variable.
    ça veut dire que je peux avoir une carte comme aussi je peux avoir 3 ou 6 cartes.
    c'est pourquoi d'ailleurs j'utilise la division euclidienne pour savoir si le nombre des cartes est paire ou impaire, car si j'ai trois cartes j'insère une dans une ligne et les deux autres dans une autres ligne avec un '-' entre le deux cartes.
    par contre ce que je n'arrive pas à faire c'est quand j'ai un nombre paire ($P mod 2 = 0) je dois tester si la concaténation avec la carte suivante est supérieur à 20 caractère. si oui je n'insère qu'une carte sinon j'insère deux cartes et la faut que je change la variable position pour qu'il ne traite pas la position suivante car la carte concernée a été déjà insérée.
    merci en tt cas

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    en fin tu veux que j'appelle une fonction de façon récursive ? c'est ça?
    Oui. Là ça s'appelle un template, mais c'est le principe.

    si oui cela ne résout pas mon problème, du fait que dés fois j'insère une carte et d'autre deux.
    faut savoir également que le nombres des cartes est variable.
    ça veut dire que je peux avoir une carte comme aussi je peux avoir 3 ou 6 cartes.
    c'est pourquoi d'ailleurs j'utilise la division euclidienne pour savoir si le nombre des cartes est paire ou impaire, car si j'ai trois cartes j'insère une dans une ligne et les deux autres dans une autres ligne avec un '-' entre le deux cartes.
    par contre ce que je n'arrive pas à faire c'est quand j'ai un nombre paire ($P mod 2 = 0) je dois tester si la concaténation avec la carte suivante est supérieur à 20 caractère. si oui je n'insère qu'une carte sinon j'insère deux cartes et la faut que je change la variable position pour qu'il ne traite pas la position suivante car la carte concernée a été déjà insérée.
    Je ne vois pas en quoi tout cela peut poser un quelconque problème, il faudrait me pointer du doigt ce qui te gêne.

    Petit exemple à l'arrache :

    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
    <template name="insert-cards">
      <param name="next-position">
      <param name="next-line-number">
      <variable name="candidate-id" select="concat(//card[$next-position]/@id, '-', //card[$next-position + 1]/@id)"/>
      <choose>
        <when test="$next-position &gt; count(//card)">
          <!-- Fin de parcours : ne rien faire -->
        </when>
        <when test="[conditions pour ne mettre qu'une carte]">
          [mettre la carte]
          <call-template name="insert-cards">
            <with-param name="next-position" select="$next-position + 1"/>
            <with-param name="next-line-number" select="$next-line-number + 1"/>
          </call-template>
        </when>
        <otherwise>
          [mettre la carte et la suivante]
          <call-template name="insert-cards">
            <with-param name="next-position" select="$next-position + 2"/>
            <with-param name="next-line-number" select="$next-line-number + 1"/>
          </call-template>
         </otherwise>
      </choose>
    </template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Points : 67
    Points
    67
    Par défaut
    merci encore une fois thelvin d'avoir pris de ton temps pour suivre avec moi mon problème.
    j'ai essayé de simuler la solution que tu m'a proposé mais bizarrement, j'en ai rien en sorti pour l'instant.
    voila mon fichier XML (avant XSL)
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <cardInfo>
     
    	<cards>
    		<card id="111111111"/>
    		<card id="222222222"/>
    		<card id="3333333"/>
    		<card id="4444444444444"/>
    		<card id="5555555555"/>
    		<card id="666"/>
    		<card id="77777777777"/>
    		<card id="888"/>
    		<card id="9999"/>
    	</cards>
    </cardInfo>
    et voila le code que tu m'a proposé avec mes templates
    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
    48
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    	<xsl:output indent="yes"/>
    	<xsl:output encoding="ISO-8859-1"/>
    	<xsl:template match="cardInfo">
     
    		<cards>
    			<call-template name="insert-cards">
    				<with-param name="next-position" select="1"/>
    				<with-param name="next-line-number" select="1"/>
    			</call-template>
    		</cards>
    	</xsl:template>
    	<template name="insert-cards">
    				<xsl:param name="next-position"/>
    				<xsl:param name="next-line-number"/>
    				<variable name="candidate-id" select="concat(//cards/card[$next-position]/@id, '-', //cards/card[$next-position + 1]/@id)"/>
    				<choose>
    					<when test="$next-position &gt; count(//cards/card)">
    						<!-- Fin de parcours : ne rien faire -->
    					</when>
    					<when test="string-length($candidate-id)&gt;=20">
    						<LineNumber>
    							<xsl:value-of select="$next-line-number"/>
    						</LineNumber>
    						<Text>
    							<xsl:value-of select="//cards/card[$next-position]/@id"/>
    						</Text>
    						<call-template name="insert-cards">
    							<with-param name="next-position" select="$next-position + 1"/>
    							<with-param name="next-line-number" select="$next-line-number + 1"/>
    						</call-template>
    					</when>
    					<otherwise>
    						<LineNumber>
    							<xsl:value-of select="$next-line-number"/>
    						</LineNumber>
    						<Text>
    							<xsl:value-of select="concat(//cards/card[$next-position]/@id, '-', //cards/card[$next-position + 1]/@id)"/>
    						</Text>
    						<call-template name="insert-cards">
    							<with-param name="next-position" select="$next-position + 2"/>
    							<with-param name="next-line-number" select="$next-line-number + 1"/>
    						</call-template>
    					</otherwise>
    				</choose>
    			</template>
    </xsl:stylesheet>
    mais en sortie (après XSL) j'ai seulement ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version='1.0' encoding='ISO-8859-1' ?>
    <cards xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <call-template name="insert-cards">
        <with-param name="next-position" select="1"/>
        <with-param name="next-line-number" select="1"/>
      </call-template>
    </cards>
    as tu une idée pourquoi il entre pas dans les chosse et affiche mes balises linenumber et Text.
    merci

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    hum, ajoute le prefixe 'xsl' aux balises concernées.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je ne vois pas en quoi tout cela peut poser un quelconque problème, il faudrait me pointer du doigt ce qui te gêne.[/code]
    j'ai rien dit monsieur thelvin, tu as tout a fait raison et le programme marche à merveille. mille merci.

    hum, ajoute le prefixe 'xsl' aux balises concernées.
    oui oui c'est l'erreur d'un débutant je l'avais remarqué après que j'ai posté le message.
    je vous remercie tous

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

Discussions similaires

  1. [Tableaux] Modifier une variable passée en get
    Par akito dans le forum Langage
    Réponses: 10
    Dernier message: 20/08/2006, 18h58
  2. Réponses: 9
    Dernier message: 03/07/2006, 18h32
  3. Modifier une variable globale
    Par bahet dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/04/2006, 18h04
  4. Impossible de modifier une table derrière un query ?
    Par Mihalis dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/04/2006, 11h11
  5. modifier une variable dans un fichier
    Par Guismay dans le forum Langage
    Réponses: 7
    Dernier message: 11/09/2005, 19h46

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