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 en fonction de son propre contenu [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 en fonction de son propre contenu
    Bonjour,
    J'ai besoin de faire une XSLT à laquelle je passe en paramètre le chemin d'une balise, une valeur cible et une condition :
    but : remplacer la valeur de la balise par valCible si le contenu de nomElement = conditionTrue

    MAis ça ne fonctionne pas.
    Auriez-vous une idée?

    Merci d'avance.

    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
    <xsl:param name="nomElement">Nom_Element</xsl:param>
    	<xsl:param name="valCible">Valeur Cible</xsl:param>
    	<xsl:param name="conditionTrue">Condition</xsl:param>
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:choose>
    				<xsl:when test="name()=$nomElement">
    				<xsl:if test=".=$conditionTrue"><xsl:value-of select="$valCible"></xsl:value-of></xsl:if>
    				<xsl:if test=".!=$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>

  2. #2
    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
    MAis ça ne fonctionne pas.
    ... ne signifie pas grand-chose. Quel genre de paramètres vous passez au xslt ? Montrez les examples typiques.

    ...je passe en paramètre le chemin d'une balise
    Là, ça peut être le problème : dedans le xslt v1.0, on ne peut pas évaluer un xpath passé comme une chaîne de texte sans faire appel aux fonctionalités d'extension comme evaluate() de saxon, ou de la librairie exslt laquelle xalan porte bien le support. Mais avant toute chose, montrez les examples d'abord.

    Aussi faites attention que un test comme ".=$conditionTrue" ne compare que le contenu textuel de l'élément avec $conditionTrue. Et dans les circonstances usuelles, on doit faire attention aux espaces blancs et il vaut mieux parfois la réécrire comme "normalize-space()=$conditionTrue".

  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 et merci du retour.

    Je vais essayer d'être plus clair :
    Dans le fichier XML ci-dessous, je voudrais remplacer OBX3.1 (nomElement) par la valeur 'RP' (valCible) si et seulement si la valeur de la balise = 'ED' (conditionTrue).
    Et pour l'instant, la XSL ne fait aucune modification sur le fichier XML en sortie.

    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
    <OBX>
    <OBX.2.1>4</OBX.2.1>
    <OBX.3.1>ST</OBX.3.1>
    <OBX.4.1>18906-8</OBX.4.1>
    <OBX.4.2>Ciprofloxacin Susc Islt</OBX.4.2>
    <OBX.4.3>LN</OBX.4.3>
    <OBX.4.4>77002705</OBX.4.4>
    <OBX.4.5>CIPROFLOXACIN</OBX.4.5>
    <OBX.4.6>QDIMIA</OBX.4.6>
    </OBX>
    <OBX>
    <OBX.2.1>5</OBX.2.1>
    <OBX.3.1>ST</OBX.3.1>
    <OBX.4.1>18928-2</OBX.4.1>
    <OBX.4.2>Gentamicin Susc Islt</OBX.4.2>
    <OBX.4.3>LN</OBX.4.3>
    <OBX.4.4>77003705</OBX.4.4>
    <OBX.4.5>GENTAMICIN</OBX.4.5>
    <OBX.4.6>QDIMIA</OBX.4.6>
    </OBX>
    <OBX>
    <OBX.2.1>1</OBX.2.1>
    <OBX.3.1>ED</OBX.3.1>
    <OBX.4.1>ClinicalPDFReport1</OBX.4.1>
    <OBX.4.2>linical PDF Report MR077065T-1</OBX.4.2>
    <OBX.4.3/>
    <OBX.4.4></OBX.4.4>
    <OBX.4.5></OBX.4.5>
    </OBX>

  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
    Si c'est le cas, je ne vois pas le problème; et si vous mettez OBX.3.1 au lieu de OBX3.1 pour nomElement ?!

  5. #5
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    Arrivez vous déjà à faire la transformation voulue sans passer aucun paramètre (en "dur") ?
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  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
    Oui, désolé, c'est OBX.3.1 : erreur de saisie
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="OBX.3.1[1]!=$conditionTrue">
    la balise OBX.3.1 sort vide sur toutes les occurrences

    par contre, si je fais référence à une autre balise , j'obtiens bien ce que je veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="following::OBX.4.1[1]=$conditionTrue">
    avec conditionTrue =ClinicalPDFReport1

    Mais, cela ne me va pas, car d'une part, je m'appuie sur une balise dont je ne suis pas sûr du contenu et d'autre part, j'aurais voulu pouvoir réutiliser cette XSL sur n'importe quelle balise.

  7. #7
    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
    Dedans un template qui matche node() ou @*, avec le test "nom()='OBX.3.1'" réussi, on dirait qu'un élément OBX.3.1 est "en contexte" : c'est important et c'est clair ? (Et, d'ailleurs, il se peut aussi qu'il soit un attribut du nom OBX.3.1, si vous voulez !)

    Maintenant avec ce contexte d'OBX.3.1, on rencontre xsl:if avec
    Code xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    	test=".=$conditionTrue"
    , ça peut s'écrire comme
    Code xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	test="self::*=$conditionTrue"
    	test="self::OBX.3.1=$conditionTrue"
    qui compare le contentu textuel à $conditionTrue, c'est clair.

    Soudin, vous le remplacez par
    Code xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    	test="OBX.3.1[1]=$conditionTrue"
    qui peut s'écrire comme (si l'une d'elles serait plus claire pour vous)
    Code xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	test="./OBX.3.1[1]=$conditionTrue"
    	test="./child::OBX.3.1[1]=$conditionTrue"
    	test="self::*/OBX.3.1[1]=$conditionTrue"
    	test="self::OBX.3.1/OBX.3.1[1]=$conditionTrue"
    	test="self::OBX.3.1/child::OBX.3.1[1]=$conditionTrue"
    Evidemment, on ne trouve rien, pas un d'OBX.3.1[1] qui soit un enfant d'un OBX.3.1.

    Pourtant, si on met
    Code xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    	test="following::OBX.4.1[1]=$conditionTrue"
    qui, encore, peut s'écrire comme
    Code xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	test="./following::OBX.4.1[1]=$conditionTrue"
    	test="self::*/following::OBX.4.1[1]=$conditionTrue"
    	test="self::OBX.3.1/following::OBX.4.1[1]=$conditionTrue"
    Alors, qu'on puisse très bien réussir à trouver un et on le trouve en effet.

    Voilà !

  8. #8
    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
    Merci beaucoup pour ces explications.

    Je viens de m'y recoller et ça fonctionne

    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">Nom_Element</xsl:param>
    	<xsl:param name="valCible">Valeur Cible</xsl:param>
    	<xsl:param name="conditionTrue">Condition</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>

  9. #9
    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,

    personnellement j'aurais simplement fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="name()=$nomElement and . = $conditionTrue">
    Mais bon.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. une page php qui enregistre son propre contenu
    Par sami_c dans le forum Langage
    Réponses: 10
    Dernier message: 24/03/2006, 17h08
  2. Récuperer la valeur d'une balise html
    Par spynux dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/02/2006, 09h40
  3. recupere valeur d'une balise select
    Par naourass dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 03/11/2005, 10h18
  4. [XML] Comment remplacer la valeur de la balise ?
    Par laclac dans le forum Langage
    Réponses: 4
    Dernier message: 19/08/2005, 15h10

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