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 :

Supprimer les Carriage Return à l'intérieur des tags


Sujet :

XML/XSL et SOAP

  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut Supprimer les Carriage Return à l'intérieur des tags
    Bonjour,

    On me procure un document XML où toutes les balises contiennent un Cariage Return (caractère ASCII 13 ou la touche Enter de votre clavier) avant et après les données.

    Comment puis-je supprimer tous ces Cariage Returns ?

    Voici un exemple de fichier (simplifié) :
    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
    <Racine>
    	<header>
    		<DateProduced>
    15/04/14
    </DateProduced>
    	</header>
    	<trader_record>
    		<city>
    NEW YORK
    </city>
    		<Transaction>
    			<WS>
    3631L
    </WS>
    			<EntryDate>
    090414
    </EntryDate>
    		</Transaction>
    		<Transaction>
    			<WS>
    8881L
    </WS>
    			<EntryDate>
    190314
    </EntryDate>
    		</Transaction>
    	</trader_record>
    </Racine>
    et je voudrais le transformer pour obtenir ceci :
    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
    <Racine>
    	<header>
    		<DateProduced>15/04/14</DateProduced>
    	</header>
    	<trader_record>
    		<city>NEW YORK</city>
    		<Transaction>
    			<WS>3631L</WS>
    			<EntryDate>090414</EntryDate>
    		</Transaction>
    		<Transaction>
    			<WS>8881L</WS>
    			<EntryDate>190314</EntryDate>
    		</Transaction>
    	</trader_record>
    </Racine>
    une solution possible serait ceci :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    <xsl:template match="*">
    	<xsl:copy>
            <xsl:apply-templates select="node()" />
        </xsl:copy>
    </xsl:template>
     
        <xsl:template match="//DateProduced" >
    			<xsl:variable name="Champ" select="current()"/>
    			<xsl:element name="DateProduced">
    						<xsl:value-of select="fn:normalize-space($Champ)"/>
    			</xsl:element>
    	</xsl:template>
     
        <xsl:template match="//city" >
    			<xsl:variable name="Champ" select="current()"/>
    			<xsl:element name="city">
    						<xsl:value-of select="fn:normalize-space($Champ)"/>
    			</xsl:element>
        </xsl:template>
     
        <xsl:template match="//WS" >
    			<xsl:variable name="Champ" select="current()"/>
    			<xsl:element name="WS">
    						<xsl:value-of select="fn:normalize-space($Champ)"/>
    			</xsl:element>	
        </xsl:template>
    </xsl:stylesheet>
    Mais cette solution m'oblige de programmer un template pour chaque balise une par une et il y en a beaucoup !

    N'y a-t-il pas moyen de de faire tout en un seul template ?


    Merci pour vos suggestions.

  2. #2
    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
    Ce template, tu veux l'appliquer sur tous les éléments qui ne contiennent que du texte, autrement tous les éléments qui ne contiennent pas d'autre élément.

    Il suffit donc de remplacer les trucs comme //DateProduced par un seul *[not(*)]
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Ho, joli !
    Merci beaucoup.

    C'est la première fois que je vois des [ ] . Qu'est-ce que cela veut dire, svp ?

    Je vais y regarder de plus près et je vous donne des nouvelles.

    Bon week-end.

  4. #4
    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
    C'est une condition que ce qui se trouve à gauche doit respecter pour être sélectionné.
    Mais bon, je suis désolé, si tu veux t'en sortir tu dois apprendre XSLT d'abord, pas demander la base de sa syntaxe sur des forums.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Merci thelvin pour le *[not(*)] .
    J'utilise XSLT une fois par an et j'ai tendance à oublier la moitié d'une fois à l'autre.
    J'ai retravaillé mon fichier XSLT et j'obtiens maintenant ce que je cherchais.
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    <xsl:template match="//*">
    	<xsl:copy>
            <xsl:apply-templates select="node()" />
        </xsl:copy>
    </xsl:template>
     
    <xsl:template match="*[not(*)]" >
    	<xsl:variable name="Champ" select="."/>
    	<xsl:variable name="NomChamp" select="name()"/>
    	<!-- le caractere plus petit que est un caractère interdit en xslt -->
    	<!-- pour eviter que mon éditeur le refuse, j'utilise disable-output-escaping -->
    	<xsl:text disable-output-escaping="yes">&lt;</xsl:text>
    	<xsl:value-of select="$NomChamp"/> 
    	<xsl:text disable-output-escaping="yes">></xsl:text>
     
    		<xsl:value-of select="fn:normalize-space($Champ)"/>
     
    	<xsl:text disable-output-escaping="yes">&lt;/</xsl:text>
    	<xsl:value-of select="$NomChamp"/> 
    	<xsl:text disable-output-escaping="yes">></xsl:text>
     
    </xsl:template>    
     
    </xsl:stylesheet>
    Je ne suis pas très content de mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		<xsl:variable name="NomChamp" select="name()"/>
    		<xsl:text disable-output-escaping="yes">&lt;</xsl:text>
    		<xsl:value-of select="$NomChamp"/> 
    		<xsl:text disable-output-escaping="yes">></xsl:text>
    mais pour le moment, cela fonctionne. Si je trouve mieux, j'améliorerai.

    Merci encore pour votre aide.

  6. #6
    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
    Oui, c'est plus sage. Voici mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:copy>
      <xsl:value-of select="normalize-space(.)"/>
    </xsl:copy>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Super !
    D'une pierre deux coups.

    1. Votre solution est nettement plus élégante que la mienne.
    2. En outre vous me résolvez un problème supplémentaire :
    La solution que j'avais ce matin fonctionne impeccablement dans Altova XMLSPY. Cependant, mes fichiers sont utilisés dans une application VBA (Microsoft Access) et lorsque j'ai voulu utiliser mon xslt dans VBA, j'ai remarqué que VBA ne supporte que XSLT 1.0 et pas XSLT 2.0. Mon instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "fn:normalize-space($Champ)"
    est refusée par VBA.
    Je suis d'autant plus enchanté de voir votre solution car vous utilisez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="normalize-space(.)"/>
    sans le "fn:". Sans le "fn:", votre syntaxe xslt et la mienne fonctionnent toutes deux dans VBA.

    Voilà une chose de plus que j'aurai apprise aujourd'hui. Décidement, une bonne journée !

    Merci.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Consultant E-Business
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 19
    Points
    19
    Par défaut XML XSL avec balises au nom dynamique (attribut)
    Bonjour et merci beaucoup pour ce petit bout de code précieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	<!-- le caractere plus petit que est un caractère interdit en xslt -->
    	<!-- pour eviter que mon éditeur le refuse, j'utilise disable-output-escaping -->
    	<xsl:text disable-output-escaping="yes">&lt;</xsl:text>
    	<xsl:value-of select="$NomChamp"/> 
    	<xsl:text disable-output-escaping="yes">></xsl:text>
     
    		<xsl:value-of select="fn:normalize-space($Champ)"/>
     
    	<xsl:text disable-output-escaping="yes">&lt;/</xsl:text>
    	<xsl:value-of select="$NomChamp"/> 
    	<xsl:text disable-output-escaping="yes">></xsl:text>
    que j'ai adapté pour mon cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	<xsl:for-each select="FLD">
    		<xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="@id"/><xsl:text disable-output-escaping="yes">></xsl:text>
    			<xsl:value-of select="normalize-space(.)"/>
    		<xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="@id"/><xsl:text disable-output-escaping="yes">></xsl:text>
    	</xsl:for-each>
    car j'ai une source de ce type à traiter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	<FLD id="LibellePeriode">Janvier 2014</FLD>
    	<FLD id="DateDebutDePeriode" type="DATE">2014-01-01</FLD>
    	<FLD id="DateFinDePeriode" type="DATE">2014-01-31</FLD>
    où la même balise se répète avec un id qui identifie le nom du champ...
    Le but est bien d'obtenir ce résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	<LibellePeriode>Janvier 2014</LibellePeriode>
    	<DateDebutDePeriode>2014-01-01</DateDebutDePeriode>
    	<DateFinDePeriode>2014-01-31</DateFinDePeriode>
    C'est un peu lourd comme écriture alors si vous avez une autre solution, merci de la proposer :-)
    Sachant que dans ce cas le <xsl:copy> n'est pas approprié pour mon cas, n'est-ce pas ?

    Cdlt,
    Annabelle

  9. #9
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    est-ce-que ceci t'aide ?
    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
    <?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="/">
    		<Racine>
    		<LibellePeriode>
    			<xsl:copy-of select="/Racine/FLD[@id='LibellePeriode']/text()"/>
    		</LibellePeriode>
    		<DateDebutDePeriode>
    			<xsl:copy-of select="/Racine/FLD[@id='DateDebutDePeriode']/text()"/>
    		</DateDebutDePeriode>
    		<DateFinDePeriode>
    			<xsl:copy-of select="/Racine/FLD[@id='DateFinDePeriode']/text()"/>
    		</DateFinDePeriode>
    		</Racine>
    	</xsl:template>
    </xsl:stylesheet>

  10. #10
    Membre à l'essai
    Femme Profil pro
    Consultant E-Business
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par PipoWIL Voir le message
    est-ce-que ceci t'aide ?
    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
    <?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="/">
    		<Racine>
    		<LibellePeriode>
    			<xsl:copy-of select="/Racine/FLD[@id='LibellePeriode']/text()"/>
    		</LibellePeriode>
    		<DateDebutDePeriode>
    			<xsl:copy-of select="/Racine/FLD[@id='DateDebutDePeriode']/text()"/>
    		</DateDebutDePeriode>
    		<DateFinDePeriode>
    			<xsl:copy-of select="/Racine/FLD[@id='DateFinDePeriode']/text()"/>
    		</DateFinDePeriode>
    		</Racine>
    	</xsl:template>
    </xsl:stylesheet>
    nope désolée, il n'y a pas que 3 lignes FLD de ce type dans le fichier XML à traiter mais des centaines donc je ne veux surtout pas faire du cas par cas ;-)
    Merci quand même, je pense que la première solution est celle qui ira bien :-D

  11. #11
    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
    Plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:element name="{@id}">
      <xsl:apply-templates/>
    </xsl:element>
    Le principe de <xsl:element> est de créer un élément dont le nom n'est pas connu à l'avance. Et les {} servent à interpréter ce qui est à l'intérieur comme une expression XPath à évaluer et convertir en string.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre à l'essai
    Femme Profil pro
    Consultant E-Business
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:element name="{@id}">
      <xsl:apply-templates/>
    </xsl:element>
    Le principe de <xsl:element> est de créer un élément dont le nom n'est pas connu à l'avance. Et les {} servent à interpréter ce qui est à l'intérieur comme une expression XPath à évaluer et convertir en string.
    Ah oui merci :-) je vais tester ça ;-)

    Edit : Impecc. ça marche, c'est exactement ce que je cherchais, merci !

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

Discussions similaires

  1. [XSLT 2.0] Supprimer les doublons en tenant compte des descendants
    Par Myrkiriad dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/04/2014, 10h10
  2. supprimer les petits rectangles au moment des sauts de lignes
    Par huître dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/04/2011, 16h52
  3. Réponses: 7
    Dernier message: 02/06/2009, 09h32
  4. Supprimer les doublons sans tri préalable des données
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 20/12/2007, 08h16

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