1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 56
    Points : 36
    Points
    36

    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
    11 137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 137
    Points : 18 854
    Points
    18 854

    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 56
    Points : 36
    Points
    36

    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 chevronné
    Inscrit en
    octobre 2011
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 024
    Points : 1 773
    Points
    1 773

    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
    11 137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 137
    Points : 18 854
    Points
    18 854

    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 56
    Points : 36
    Points
    36

    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