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 la valeur d'une balise sous condition [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut Remplacer la valeur d'une balise sous condition
    Bonsoir,

    Voici mon problème : je dois remplacer une balise par sa valeur concaténé à toto par exemple :
    dans mon cas précis, je voudrais remplacer le P et le Z dans OBR.5.1 par toto_P et toto_Z

    extrait 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
    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
    <ORC>
    <ORC.2.1>SC</ORC.2.1>
    <ORC.3.1>17P10219</ORC.3.1>
    <ORC.4.1>A17-015934</ORC.4.1>
    <ORC.5.1>17P10219</ORC.5.1>
    <ORC.6.1>CM</ORC.6.1>
    <ORC.8.1/>
    <ORC.8.2/>
    <ORC.8.3/>
    <ORC.8.4>20170622145309</ORC.8.4>
    <ORC.10.1>20170622145309</ORC.10.1>
    <ORC.11.1>20170705150557</ORC.11.1>
    </ORC>
    <OBR>
    <OBR.2.1>1</OBR.2.1>
    <OBR.3.1>17P10219</OBR.3.1>
    <OBR.4.1>A17-015934</OBR.4.1>
    <OBR.5.1>P</OBR.5.1>
    <OBR.5.2>histologies</OBR.5.2>
    </OBR>
    <ORC>
    <ORC.2.1>SC</ORC.2.1>
    <ORC.3.1>17P10219</ORC.3.1>
    <ORC.4.1>A17-015934</ORC.4.1>
    <ORC.5.1>17P10219</ORC.5.1>
    <ORC.6.1>CM</ORC.6.1>
    <ORC.8.1/>
    <ORC.8.2/>
    <ORC.8.3/>
    <ORC.8.4>20170622145309</ORC.8.4>
    <ORC.10.1>20170622145309</ORC.10.1>
    <ORC.11.1>20170705150557</ORC.11.1>
    </ORC>
    <OBR>
    <OBR.2.1>1</OBR.2.1>
    <OBR.3.1>17P10219</OBR.3.1>
    <OBR.4.1>A17-015934</OBR.4.1>
    <OBR.5.1>Z</OBR.5.1>
    <OBR.5.2>histologies</OBR.5.2>
    </OBR>

    J'ai essayé plusieurs solutions mais soit le code ne change rien, soit je me retrouve avec P dans les deux balises.
    Je suis donc passé par un appel en boucle sur OBR.5.1 de la XSL ci-dessous, mais ce n'est pas mieux : aucune transformation sur la balise en question :

    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
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0"/>
    	<xsl:param name="nomElement">OBR.5.1</xsl:param>
    	<xsl:param name="valCible">toto_P</xsl:param>
    	<xsl:param name="conditionTrue">P</xsl:param>
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:choose>
    				<xsl:when test="name()=$nomElement">
    				<xsl:if test="self::*=$conditionTrue"><xsl:value-of select="$valCible"></xsl:value-of></xsl:if>
    				<xsl:if test="self::*!=$conditionTrue"><xsl:apply-templates select="@* | node()"/></xsl:if>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:apply-templates select="@* | node()"/>
    				</xsl:otherwise>	
    			</xsl:choose>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>
    Une idée?
    Merci.

  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
    Hello,

    pourquoi as-tu tous ces paramètres ? La balise à changer n'est-elle pas toujours <OBR.5.1> ?
    Ça change quelque chose si son contenu n'est ni P ni Z mais par exemple F ?
    Si tu tombes sur <OBR.5.1>F</OBR.5.1> tu ne veux pas forcément le remplacer par <OBR.5.1>toto_F</OBR.5.1> mais peut-être par <OBR.5.1>EVIV_BULGROZ</OBR.5.1> ?
    À quoi servent ces paramètres ?

    Dans le code que tu nous montres, tu ne reconnais que les P, et de ce que j'en vois les P sont bel et bien remplacés par toto_P. Ce n'est pas le résultat chez toi ? Alors le moteur XSLT que tu utilises a un bug, chez moi ça marche et ça devrait marcher partout.

    Si tes P sont bel et bien remplacés par toto_P mais que les Z ne sont pas modifiés, ben c'est parce que tu vérifies pas les Z. Il va falloir que tu le fasses, et d'un seul coup tout va marcher.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    J'ai passé des paramètres parce que j'ai plusieurs balises à traiter de cette façon.
    Ce que je veux faire c'est préfixer systématiquement la valeur de OBR.5.1 qui peut être n'importe quoi par toto_.
    <OBR.5.1>P</OBR.5.1>==> <OBR.5.1>toto_P</OBR.5.1>
    <OBR.5.1>Z</OBR.5.1>==><OBR.5.1>toto_Z</OBR.5.1> ...

    J'appelle cette XSL dans un for each qui balaie toutes les balises OBR de mon fichier et tente de remplacer le contenu de la balise passée en paramètre (nomElement) par valCible si le contenu de la balise est à la base égal à conditionTrue.

    J'ai positionné les paramètres pour exemples.

    Merci de ton aide.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    En faisant une énumération des conditions pas trop démesuré n'est pas vraiment considéré inefficace en xslt, et parfois bien souhaîtable. Dans ce cas-ci, on peut facilement faire comme ça: d'abord la partie de paramètres...
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:param name="nomElement">OBR.5.1</xsl:param>
    <xsl:param name="valCible">toto_P</xsl:param>
    <xsl:param name="conditionTrue">P</xsl:param>
    <xsl:param name="valCible2">toto_Z</xsl:param>
    <xsl:param name="conditionTrue2">Z</xsl:param>
    et puis, le template majeur s'adapte d'après le besoin de désigne...
    Code xslt : 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
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:choose>
                <xsl:when test="name()=$nomElement">
                    <xsl:choose>
                        <xsl:when test="normalize-space()=$conditionTrue"><xsl:apply-templates select="@*" /><xsl:value-of select="$valCible"></xsl:value-of></xsl:when>
                        <xsl:when test="normalize-space()=$conditionTrue2"><xsl:apply-templates select="@*" /><xsl:value-of select="$valCible2"></xsl:value-of></xsl:when>
                        <xsl:otherwise><xsl:apply-templates select="@* | node()"/></xsl:otherwise>
                    </xsl:choose>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="@* | node()"/>
                </xsl:otherwise>	
            </xsl:choose>
        </xsl:copy>
    </xsl:template>
    Ça devrait marcher.

  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
    Citation Envoyé par Michalak Voir le message
    J'ai passé des paramètres parce que j'ai plusieurs balises à traiter de cette façon.
    Je ne comprends pas ce que tu veux dire. Des paramètres ne peuvent pas t'aider à faire ça, bien au contraire. Ou alors je ne sais pas à quoi tu penses.

    Citation Envoyé par Michalak Voir le message
    J'appelle cette XSL dans un for each qui balaie toutes les balises OBR de mon fichier et tente de remplacer le contenu de la balise passée en paramètre (nomElement) par valCible si le contenu de la balise est à la base égal à conditionTrue.
    Mais tu viens de dire juste au-dessus que tu te fiches de ce qu'il y a dans la balise, tu veux toujours mettre toto_ devant !
    Pourquoi alors tu irais vérifier si la balise est égale à je ne sais quelle condition ? Il n'y a rien à vérifier, c'est une balise que tu veux changer donc tu la changes !

    Je ne comprends pas à quoi tu penses, c'est complètement embrouillé ce que tu racontes. Un coup tu veux changer toutes les balises, un autre coup tu veux vérifier si elles sont égales à ci ou ça...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Bonjour,
    Effectivement tsuji, ça fonctionne parfaitement.
    Merci.

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

Discussions similaires

  1. [XSLT 1.0] Remplacer la valeur d'une balise en fonction de son propre contenu
    Par Michalak dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 11/05/2016, 17h10
  2. Afficher valeur d'une balise avec condition
    Par mejdi.mohamed dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/02/2015, 11h25
  3. [XML] Comment remplacer la valeur de la balise ?
    Par laclac dans le forum Langage
    Réponses: 4
    Dernier message: 19/08/2005, 15h10
  4. [XSLT] inclure du XSL dans une balise html
    Par iaa dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/08/2002, 15h57

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