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 :

condition xslt remplace d'un caractère par un autre


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Par défaut condition xslt remplace d'un caractère par un autre
    Bonjour,

    J'aurais une petite question pour les connaisseurs. Est-il possible avec mon xslt de regarder dans mes balises xml si il y a des retours chariots et si oui les remplacer par un autre caractère par exemple "¤¤" ?

    Je vous remercie d'avance

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Possible oui.

    Mais en XLST 1.0 sans EXSLT, facile non.

    Le problème, c'est pour modifier le texte. La seule manière de faire est d'appeler un template récursif sur le texte à modifier, qui va chercher s'il y a un retour chariot dedans.
    Si non, le texte est renvoyé tel quel.
    Si oui, utilisation de substring-before() et substring-after() pour séparer avant le premier retour chariot et après. Le texte renvoyé est ce qu'il y a avant, suivi des caractères de remplacement, suivi de l'appel récursif sur ce qu'il y a après.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Possible oui.

    Mais en XLST 1.0 sans EXSLT, facile non.

    Le problème, c'est pour modifier le texte. La seule manière de faire est d'appeler un template récursif sur le texte à modifier, qui va chercher s'il y a un retour chariot dedans.
    Si non, le texte est renvoyé tel quel.
    Si oui, utilisation de substring-before() et substring-after() pour séparer avant le premier retour chariot et après. Le texte renvoyé est ce qu'il y a avant, suivi des caractères de remplacement, suivi de l'appel récursif sur ce qu'il y a après.
    Je te remercie de ta réponse
    Aurais-tu un exemple type afin que je puisse m'en inspiré ou débuter s'il te plait?

  4. #4
    Membre confirmé
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Par défaut translate
    j'ai effectué cette manip mais apparemment ça ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:variable name="response"  select="."/>
    <xsl:value-of select="translate($responses,'
    ','non')"/>

  5. #5
    Membre confirmé
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Par défaut remplace le retour chariot par un ¤
    j'ai réussi à remplacer le retour chariot par un autre caractère qui est ¤ voici le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:value-of select="translate(.,'
    ','¤¤')"/>
    si vous avez d'autre proposition de code pour faire cela je suis preneur

  6. #6
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    La fonction translate travaille caractère par caractère. C'est quelque chose dont on (moi en tout cas) n'a pas vraiment l'habitude en programmation :
    1
    2
    translate(..., '
    ', 'non')
    signifie :
    - remplace le caractère '\r' par 'n'.
    - remplace le caractère '\n' par 'o'.
    le dernier 'n' est ignoré car il ne correspond à aucun caractère en entrée.

    Malheureusement en XPath 1.0 c'est la seule fonction de remplacement qui existe. Pour remplacer un string (resp. un ou plusieurs caractère(s)) par un autre (resp. plusieurs ou un caractère(s)), il te faut passer par un template récursif. Ce n'est pas bien compliqué mais c'est relativement lourd.

  7. #7
    Membre confirmé
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Par défaut
    Citation Envoyé par Loceka Voir le message
    La fonction translate travaille caractère par caractère. C'est quelque chose dont on (moi en tout cas) n'a pas vraiment l'habitude en programmation :
    1
    2
    translate(..., '
    ', 'non')
    signifie :
    - remplace le caractère '\r' par 'n'.
    - remplace le caractère '\n' par 'o'.
    le dernier 'n' est ignoré car il ne correspond à aucun caractère en entrée.

    Malheureusement en XPath 1.0 c'est la seule fonction de remplacement qui existe. Pour remplacer un string (resp. un ou plusieurs caractère(s)) par un autre (resp. plusieurs ou un caractère(s)), il te faut passer par un template récursif. Ce n'est pas bien compliqué mais c'est relativement lourd.
    Ah d'accord pourrais-tu me montrer comment procède t-on pour faire un template récursif ( je suis débutant en xslt )
    Fichiers attachés Fichiers attachés

  8. #8
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Je viens de remarquer vous utilisez une construction comme ceci:
    <!-- &_# lire comme &# -->
    <xsl:with-param name="search">
    <xsl:text>&_#13;&_#10;</xsl:text>
    </xsl:with-param>
    Je dirais non. C'est de chercher de problème pour soi-même et il devient implémentation dépendante: certain xslt engin le prend très mal. Il vaut mieux toujours s'écrire soit comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!-- &_# lire comme &# -->
    <xsl:with-param name="search" select="'&_#13;&_#10;'" />
    soir comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!-- &_# lire comme &# -->
    <xsl:with-param name="search">
        <xsl:value-of select="'&_#13;&_#10;'" />
    </xsl:with-param>

  9. #9
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    [HS]
    @tsuji: tu peux écrire &#[B][/B]10; pour que ça s'affiche bien (cf ce post)
    [/HS]

    Sinon je ne savais pas que le <text>...</text> pouvait être mal interprété, ceci dit je l'utilise extrèmement rarement. ^_^

  10. #10
    Membre confirmé
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Par défaut retour chariot
    Je vous remercie pour vos réponses

    mais malheureusement lors de la saisie de vos code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:with-param name="search">
    <xsl:value-of select="'
    '"/>
    </xsl:with-param>
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:with-param name="search">
        <xsl:value-of select="'&_#13;&_#10;'" />
    </xsl:with-param>
    je recois un message d'erreur

    Erreur d'analyse XML : mal formé
    Emplacement : file:///E:/mairie%20de%20paris/xsl/test/form/Lutece-sourcing.xsl
    Numéro de ligne 96, Colonne 37 : <xsl:value-of select="'&#10;'

  11. #11
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    J'espère que vous aviez enlever le "underscore" (_) au moins dans le second cas dans le code réel?

    Mais pour le premier, c'est tout de même m'étonner. C'est de jamais vu. Avez-vous essayé l'autre version?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:with-param name="search" select="'
    '" />
    Il se peut que le message provenait de par d'autre raison syntactique ailleurs.

  12. #12
    Membre confirmé
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Par défaut
    Citation Envoyé par tsuji Voir le message
    J'espère que vous aviez enlever le "underscore" (_) au moins dans le second cas dans le code réel?

    Mais pour le premier, c'est tout de même m'étonner. C'est de jamais vu. Avez-vous essayé l'autre version?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:with-param name="search" select="'
    '" />
    Il se peut que le message provenait de par d'autre raison syntactique ailleurs.
    oui oui j'ai bien enlevé le _ j'ai tester de différente facon avec un &#xa; etc... ça ne marche toujours pas je suis maudit je crois bien

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il doit y avoir un problème dans la chaîne d'outils. 'Faudrait qu'on sache avec quoi tu travailles.

    Qu'est-ce qui fournit le fichier XML d'entrée, qu'est-ce qui consomme le fichier texte de sortie, quel est le moteur XSLT utilisé et comment est-il invoqué. Ce genre de choses.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre confirmé
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Il doit y avoir un problème dans la chaîne d'outils. 'Faudrait qu'on sache avec quoi tu travailles.

    Qu'est-ce qui fournit le fichier XML d'entrée, qu'est-ce qui consomme le fichier texte de sortie, quel est le moteur XSLT utilisé et comment est-il invoqué. Ce genre de choses.
    je travail avec Lutece qui est un moteur de portail libre et *Open Source écrit en Java et est basé sur des briques Open Source éprouvées et reconnues (Spring, Jakarta-Commons, Freemarker, Lucene, Ehcache, ...).

  15. #15
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ok, c'est un début...

    Et le reste de mes questions ? Pour autant que je sache, tout ce petit monde ne produit jamais de fichiers textes à l'aide de XSLT, n'est-ce pas ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    @Loceka: salut Tlouye, merci pour le truc et l'effort d'alerter le management.

    En ce qui concerne la syntaxe utilisant xsl:text, je peux proposer un petit document xslt autonome pour faire tester.
    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
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="utf-8" />
    <xsl:param name="s" select="'cr: 
     etc cr: 
     etc'" />
    <xsl:template match="/">
    <root>
    <result-select>
        <xsl:call-template name="string-replace">
            <xsl:with-param name="str" select="$s" />
            <xsl:with-param name="search" select="'
    '" />
            <xsl:with-param name="replace" select="'¤'" />
        </xsl:call-template>
    </result-select>
    <result-text>
        <xsl:call-template name="string-replace">
            <xsl:with-param name="str" select="$s" />
            <xsl:with-param name="search">
                <xsl:text>
    </xsl:text>
            </xsl:with-param>
            <xsl:with-param name="replace" select="'¤'" />
        </xsl:call-template>
    </result-text>
    </root>
    </xsl:template>
    <!-- ajouter to template nommé aussi... -->
    </xsl:stylesheet>
    Il ne donne pas les même résultats pas MSXML2 ou msxsl.exe. Le second cas, result-text, rien n'est remplacé... Pour xerces, saxon, par exemple, ça va. En tout cas, ce sont des petites détailles qui lient probablement avec seulement des caractères invisibles comme cr, lf...

Discussions similaires

  1. Remplacer chaine de caractères par une autre chaine
    Par unmaxdemily dans le forum SAS Base
    Réponses: 2
    Dernier message: 25/06/2008, 09h11
  2. Remplacer un caractère par un autre
    Par cybkilla dans le forum Sybase
    Réponses: 3
    Dernier message: 08/01/2007, 15h42
  3. JSP : comment remplacer une chaine de caractères par une autre
    Par techquos dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/12/2006, 09h37
  4. Réponses: 8
    Dernier message: 15/07/2006, 18h59
  5. [XSLT ]remplacement d un caractere par son code
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 02/09/2005, 16h26

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