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 :

remplacer du text du select [XSLT 2.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut remplacer du text du select
    Bonjour à tous,


    Voilà je plonge dans le XSLT et j'aurais besoin de savoir comment faire pour dans le code suivant

    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
        <xsl:template match="onix3:TextContent">
            <xsl:if test="./onix3:TextType='03' or (./onix3:TextType='05' and count(../onix3:TextContent[onix3:TextType='03']) = 0)">
                <xsl:element name="description">
                    <xsl:attribute name="format">
                        <xsl:choose>
                            <xsl:when test="./onix3:Text/@textformat='05'">html</xsl:when>
                            <xsl:otherwise>plain</xsl:otherwise>
                        </xsl:choose>
                    </xsl:attribute>
                    <xsl:text disable-output-escaping="yes"><![CDATA[ <![CDATA[  ]]></xsl:text>
                        <xsl:apply-templates mode="copy-without-ns" select="./onix3:Text"/>
                    <xsl:text disable-output-escaping="yes"><![CDATA[]]]]><![CDATA[>]]></xsl:text>
                </xsl:element>
            </xsl:if>
        </xsl:template>
    au moment du select dans le texte que je sélectionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates mode="copy-without-ns" select="./onix3:Text"/>
    comment faire pour remplacer le texte qui si trouve, on supposant qu'il contienne par exemple: "bb" remplacé par "cc" et "ee" remplacé par "ff", il y aurais deux changement à faire et la je sèche un peut....

    je suis sur la piste du translate.....

    http://stackoverflow.com/questions/8...on-in-xslt-1-0


    je vous remercie d'avance.

  2. #2
    Expert confirmé
    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
    Points : 4 843
    Points
    4 843
    Par défaut
    Citation Envoyé par Snyper Voir le message
    je suis sur la piste du translate.
    C'est une mauvaise piste.

    Le translate permet seulement de remplacer un unique caractère par un autre caractère. Ca ne marche pas pour des chaines (plusieurs caractères à remplacer par un ou plusieurs caractères ou le contraire).

    Tu n'as que 3 solutions pour faire ça (de la plus simple à la plus complexe):
    1. passer sur du XSLT/XPath 2.0 (si ton parseur XSL le gère) et utiliser la méthode replace
    2. utiliser EXSLT (si ton parseur XSL le permet) et sa fonction replace
    3. faire un template récursif qui remplacera chaque occurence de ta première chaine par la seconde (utilisation de substring-before et substring-after)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut
    Bonjour merci pour ta réponse,

    Je vais voir ça il faut aussi que je regarde un peut la norme onix3 car elle est présente dans la transformation.



    Bien cordialement,

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut
    Donc la façon dont le valeur est copié par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:text disable-output-escaping="yes"><![CDATA[ <![CDATA[  ]]></xsl:text>
                        <xsl:apply-templates mode="copy-without-ns" select="./onix3:Text"/>
                    <xsl:text disable-output-escaping="yes"><![CDATA[]]]]><![CDATA[>]]></xsl:text>
    comment faire pour remplacer le texte.....

    ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rende: quelque chose </br></br>
    Merci

  5. #5
    Expert confirmé
    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
    Points : 4 843
    Points
    4 843
    Par défaut
    Alors déjà c'est pas du texte.
    <p>quelque chose</p> c'est un élément (p) avec du contenu texte. Et tu veux le remplacer (l'élément) par un élément texte suivi de 2 éléments br.

    C'est déjà plus du tout pareil.

    Mais pour le remplacement du texte en soit, les 3 solutions dont j'ai parlé ne changent pas.
    Ce qui ne change pas non plus c'est notre connaissance sur ton parseur :
    - peut-il gérer le XSL 2.0 ?
    - peut-il gérer EXSLT ?

    En gros qu'as-tu tenté de faire ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut
    Oui c'est juste, je suis désolé pour l'erreur....

    mais je pense qu'avec ce paramètre:

    les nœuds fils sont copié comme du texte, je me trompe?

    Alors je peux faire un truc du style?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:value-of  select=" replace(current(),'&#139;p&#155;','OUTRE_CHOSE')"/>
    <xsl:text disable-output-escaping="yes"><![CDATA[ <![CDATA[  ]]></xsl:text>
                        <xsl:apply-templates mode="copy-without-ns" select="./onix3:Text"/>
                    <xsl:text disable-output-escaping="yes"><![CDATA[]]]]><![CDATA[>]]></xsl:text>
    </xsl:value-of>

  7. #7
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour,

    Les trucs pour les machins choses ne sont utiles qu'aux bidules, c'est clair
    Sinon, tu peux nommé les objets : un objet <=> un nom.

    mais je pense qu'avec ce paramètre:
    mode="copy-without-ns"
    Oui, tu te trompe car ce que tu nous montre n'est pas un paramètre
    mais un attribut définit avec la valeur copy-without-ns.

    Après, il nous faut :
    1. le nom de ton processeur XSLT (Xalan, Saxon, ...)
    2. l'environnement : utilise tu EXSLT ?
    3. la version de XSLT : 1.0 ou 2.0 ?
    4. ton fichier XML et ton fichier XSLT, ou des extraits de ces fichiers.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut
    Merci pour la réponse sympa

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut
    Ok je vais faire une étude sur XSLT Xpath et revenir pour faire des question pertinentes.

    Je vous remercie pour vos réponse.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut
    Voila la solution:


    Si jamais ça peut aidé:

    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
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:marc="http://www.loc.gov/MARC21/slim">
        <xsl:output method="xml" indent="yes"/>
     
    <xsl:template match="/">
    	<xsl:for-each select="record">
    		<xsl:for-each select="textDescription">
    			<xsl:element name="description">
                    <xsl:attribute name="format">html</xsl:attribute>
    				<xsl:text disable-output-escaping="yes"><![CDATA[ <![CDATA[  ]]></xsl:text>
                        <xsl:apply-templates mode="copy-without-ns" select="*"/>
                    <xsl:text disable-output-escaping="yes"><![CDATA[]]]]><![CDATA[>]]></xsl:text>
                </xsl:element>
    	<xsl:apply-templates mode="copy-without-ns" select="*"/>
    	</xsl:for-each>
     </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="*" mode="copy-without-ns">
      <xsl:choose>
    	  <xsl:when test="local-name() = 'Text'">
    		  <xsl:copy-of select="@*[local-name()!='textcase' and local-name()!='textformat']"/>
    		  <xsl:apply-templates mode="copy-without-ns"/>
    	  </xsl:when>
    	  <xsl:when test="local-name() = 'p'">
    		  <xsl:value-of select="text()"/>
    		  <xsl:element name="br"/>
    		  <xsl:element name="br"/>
    		  <xsl:apply-templates mode="copy-without-ns" select="./*" />
    	  </xsl:when>
    	  <xsl:otherwise>
    		  <xsl:element name="{local-name()}">
    			  <xsl:copy-of select="@*[local-name()!='textcase' and local-name()!='textformat']"/>
    			  <xsl:apply-templates mode="copy-without-ns"/>
    		  </xsl:element>
    	  </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    </xsl:stylesheet>
    et le xml de test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="test1.xsl"?>
    <record>
    <textDescription><p>Levels in the levels node are L1 toto L2 toto suite</p></textDescription>
    </record>
    Cordialement,

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

Discussions similaires

  1. Programme de remplacement de texte dans des fichiers
    Par Invité4 dans le forum Linux
    Réponses: 13
    Dernier message: 12/11/2006, 16h06
  2. remplacer du texte dans un tableau généré
    Par jcaruana dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/02/2006, 16h36
  3. Comment remplacer un texte ?
    Par EssaiEncore dans le forum Langage
    Réponses: 8
    Dernier message: 09/12/2005, 11h42
  4. Remplacer un texte par un autre
    Par Guillaume602 dans le forum C++
    Réponses: 3
    Dernier message: 24/11/2005, 00h40
  5. [langage] Remplacer du texte dans un fichier
    Par Michaël dans le forum Langage
    Réponses: 9
    Dernier message: 11/03/2005, 15h19

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