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

XML/XSL et SOAP Discussion :

[XSL] Transformation de string avec espaces


Sujet :

XML/XSL et SOAP

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 19
    Points
    19
    Par défaut [XSL] Transformation de string avec espaces
    Bonjour,

    Voilà, j'ai un fichier XML du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <table>
        <tr>
             <td>ligne1</td>
             <td>AA BB CC</td>
             <td>DD EE FF</td>
        </tr>
    </table>
    Je voudrais le transformer à l'aide d'un fichier XSL pour obtenir :

    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
     
    <GROUPE>
        <LIGNE>ligne 1</LIGNE>
        <SOLLICITATION>
            <NUM_MECA>AA</NUM_MECA>
            <COEF_MULT_FIXE>DD</COEF_MULT_FIXE>
        </SOLLICITATION>
        <SOLLICITATION>
            <NUM_MECA>BB</NUM_MECA>
            <COEF_MULT_FIXE>EE</COEF_MULT_FIXE>
        </SOLLICITATION>
        <SOLLICITATION>
            <NUM_MECA>CC</NUM_MECA>
            <COEF_MULT_FIXE>FF</COEF_MULT_FIXE>
        </SOLLICITATION>
    </GROUPE>
    Et là, je ne vois vraiment aps comment faire.
    J'ai bien essayé de faire un boucle du genre

    <xsl:variable name="solli" select="td[2]"/>
    <xsl:variable name="coef" select="td[3]"/>
    <xsl:for-each select="xalan:tokenize($solli,' ')">
    ...
    </xsl:for-each>

    Le soucis, c'est que je ne vois pas comment boucler en même temps sur ma variable "coef". :/
    Enfin si quelqu'un a une autre idée qu'en passant par xalan:tokenize, je suis tout ouïe

  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,

    le plus simple est de passer par une petite fonction 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
     
    <xsl:template match="tr">
      <GROUPE>
        <LIGNE><xsl:value-of select="td[1]"/></LIGNE>
        <xsl:call-template name="boucle">
          <xsl:with-param name="meca" select="concat(td[2], ' ')"/>
          <xsl:with-param name="coef" select="concat(td[3], ' ')"/>
        </xsl:call-template>
      </GROUPE>
    </xsl:template>
    <xsl:template name="boucle">
      <xsl:param name="meca"/>
      <xsl:param name="coef"/>
      <xsl:if test="$meca != ''">
        <SOLLICITATION>
          <NUM_MECA><xsl:value-of select="substring-before($meca, ' ')"/></NUM_MECA>
          <COEFF_MULTI_FIXE><xsl:value-of select="substring-before($coef, ' ')"/></COEFF_MULTI_FIXE>
        </SOLLICITATION>
        <xsl:call-template name="boucle">
          <xsl:with-param name="meca" select="substring-after($meca, ' ')"/>
          <xsl:with-param name="coef" select="substring-after($coef, ' ')"/> 
        </xsl:call-template>
      </xsl:if>
    </xsl:template>

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Ha ouais c'est ça la solution !
    En fait, ce que tu m'as donné comme solution résoud un de mes problèmes récurrents. Souvent, j'ai besoin d'une variable externe à une boucle for pour la mettre à jour à chaque tour de boucle.
    En effet, en passant pour un template, ça résoud le problème.
    Parce que j'avais déjà tenté unh truc du style avec des substring-before, mais je ne m'en sortais pas à cause de ce soucis.

    Je venais à l'instant de voir qu'il était surement possible de faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xalan:tokenize($string,' ')[$position]
    Je vais voir ce que je décide, mais ta solution me parait plus rapide (niveau temps CPU). Merci

  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 VolaiL
    Je vais voir ce que je décide, mais ta solution me parait plus rapide (niveau temps CPU). Merci
    ...et elle est portable. Le problème de tokenize est qu'il s'agit d'une extension Xalan et que donc elle ne fonctionnera pas si tu fais ta transformation avec MSXML dans Internet Explorer, par exemple.

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

Discussions similaires

  1. [XSL] Transformation d´un string en plusieurs
    Par sylvie dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 07/07/2010, 11h54
  2. string avec espace -> xml
    Par Pitou5464 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 15/01/2008, 15h23
  3. Transformer un string avec un separateur en File
    Par tchoukapi dans le forum Langage
    Réponses: 7
    Dernier message: 23/03/2007, 12h18
  4. Convertir une string avec espace en Single
    Par shirya dans le forum C#
    Réponses: 24
    Dernier message: 23/03/2007, 09h20
  5. [Date] Comment transformer mon String en date avec newDate?
    Par Devil666 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/06/2005, 16h50

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