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 :

[XSLT] mettre en couleur un fragment du texte


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [XSLT] mettre en couleur un fragment du texte
    Bonjour à tous,

    J'ai lu quelques de vos discussions, ça fait du bien de pouvoir compter sur votre aide, ne vous découragez pas.

    voici mon problème,
    soit un fragment du fichier xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <contexte>
    <Turn speaker="spk1 spk2">
    <Who nb="1"/>
    mais vous <adverbe>personnellement</adverbe> vous ne le faites pas non
    <Who nb="2"/>
    oui i(l) y en a qui en mettent moi non non
    <Who nb="1"/>
    <Who nb="2"/>
    </Turn>
    </contexte>
    je voudrais afficher en même temps le contenu du <contexte> avec le contenu du <adverbe> en rouge.
    ex. mais vous personnellement vous ne le faites pas non
    J'ai reussi l'afficher en rouge avant ou après le contexte mais pas dans le texte. Comment faire ???
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Qu'est-ce qui est utiliser pour la mise en forme ? CSS ? XSLT ?

    Dans quel contexte ? Le XML est exploité directement ? Transformé en (X)HTML ? etc.

    Autrement dit, il faudrait un petit peu plus de détail s'il te plaît

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de s'intéresser à mon problème,

    La feuille de style est en xslt.
    On travaille directement sur un fichier xml.
    Le résultat est en html.
    J’édite avec Cooktop.

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Dans ce cas, il te suffit de générer pour cette balise, le code HTML pour afficher en rouge...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    pas si simple, il faut afficher le mot (adverbe) en rouge dans le texte et non pas avant ou après. Voici mon code, je pense qu'il est mal écrit, mais je ne vois pas où.

    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:template match="Trans">
    <html>
    <xsl:for-each select="contexte">	
    <b><xsl:value-of select="."/></b><br/><br/>	
    </xsl:for-each>	
    </html>		
    <xsl:apply-templates select="contexte/Turn"/>
    </xsl:template>
     
    <xsl:template match="contexte/Turn">	
     
    <html>	
    <font color="#FF0000"><i>
    <xsl:value-of select="./adverbe"/></i></font><br/>						
    </html>	
    </xsl:template>
    Merci d'avance.

  6. #6
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Pour ce type de pb ce n'est pas ce type d'algo qu'il faut rechercher mais celui ci

    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <R>
    <texte>Un premiere partie <gras>en gras</gras>, puis <italique>italique</italique> , puis de la <couleur>couleur</couleur></texte>
    </R>
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="html"/>
    	<xsl:template match="/">
    		<html>
    			<head>
    				<title>test</title>
    			</head>
    			<body>
    				<xsl:apply-templates select="R/texte"/>
    			</body>
    		</html>
    	</xsl:template>
    	<xsl:template match="texte">
    		<xsl:apply-templates select="node()"/>
    	</xsl:template>
    	<xsl:template match="text()">
    		<xsl:value-of select="."/>
    	</xsl:template>
    	<xsl:template match="gras">
    		<b>
    			<xsl:value-of select="."/>
    		</b>
    	</xsl:template>
    	<xsl:template match="italique">
    		<i>
    			<xsl:value-of select="."/>
    		</i>
    	</xsl:template>
    	<xsl:template match="couleur">
    		<font color="#FF0000">
    			<xsl:value-of select="."/>
    		</font>
    	</xsl:template>
    </xsl:stylesheet>

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai refait mon code, maintenant ça marche.
    Merci mille fois. Bon dimanche.
    olbrach

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 12
    Points
    12
    Par défaut
    Salutations,

    Je rencontrais -peu ou prou- les mêmes difficultés qu'olbrach, et la solution d'Erwy m'a permis d'y faire face. Et je l'en remercie. Toutefois, parallèlement et avant de trouver ce fil de discussion, j'ai soumis mon problème à mon enseignant référent du CNAM sur XML, et voici sa réponse (adaptée et synthétisée pour l'exemple "couleur" ci-dessus)
    J'aurais pour ma part écrit (si j'ai bien compris la question) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        <!-- Template "texte" -->
    	<xsl:template match="texte">
    		<xsl:apply-templates />
    	</xsl:template>
     
       <!-- Template "couleur" -->
    	<xsl:template match="couleur">
    		<font color="#FF0000">
    			<xsl:value-of select="."/>
    		</font>
    	</xsl:template>
    Dans cette solution, on ne fait pas appel à la fonction node(). Par contre, on s'appuie sur le comportement natif du processeur XSLT concernant l'élément xsl:apply-templates.

    Il me semble (mais il s'agit là plus d'une question que d'un avis averti), que cette deuxième solution est plus élégante puisque faisant l'économie d'un appel de fonction. En effet: d'une part elle est plus concise du point de vue de l'écriture; et d'autre part, elle s'appuie sur le comportement natif du processeur XSLT. Donc, j'ai tendance à penser qu'elle serait plus idiomatique et surtout plus performante.

    D'un autre côté, la solution d'Erwy pourrait apparaître plus pédagogique, puisqu'elle lève toute ambiguïté en décomposant plus d'étapes de l'algo. Et en ce sens, sa lisibilité et sa maintenance est peut-être meilleure.

    J'ai bien conscience d'intervenir près de 10 ans après la question initiale. Et probablement qu'en 10 ans, le comportement du processeur XSLT a changé, et qu'il faudrait certainement remettre la réponse d'Erwy dans son contexte. Mais preuve en est de mon cas personnel, que les questions et problèmes rencontrés sont toujours les mêmes et d'actualité. Et je suis convaincu que les "vieux" fils de discussion -dont celui-ci fait partie- n'ont pas seulement une valeur "historique" mais bel et bien "pratique".

    L'une de ces deux solutions vous apparaît-elle meilleure que l'autre ?

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 564
    Points : 21 629
    Points
    21 629
    Par défaut
    Hello,

    les deux veulent dire la même chose. <xsl:apply-templates/> est une manière courte d'écrire <xsl:apply-templates select="node()"/>. Ce qui se passe derrière c'est pareil.

    Donc on optimise rien du tout. Par contre, bon, puisqu'il y a une syntaxe spéciale faite pour ça, c'est peut-être plus clair de s'en servir.

    À noter que node() n'est pas un appel de fonction, bien que la syntaxe ressemble. C'est un test "type de nœud" qui veut dire tous les nœuds, au même titre que text() pour les nœuds textes et * pour les éléments.
    Il reprend la même syntaxe qu'une fonction parce qu'il a pas le choix. Si on faisait juste node ça voudrait dire les éléments <node>. Tout comme text voudrait dire les éléments <text> or c'est pas ce qu'on veut, on veut les nœuds texte. D'où syntaxe particulière pour différencier node et node() et pour différencier text et text().
    Au final ça veut juste dire que quand on vérifie si un nœud réussit ce test, oui, il le réussit. Tout comme quand on vérifie si un nœud réussit le test * il le réussit si c'est un élément. Et le test zorglub il le réussit si c'est <zorglub>. Pas d'appel de fonction.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 12
    Points
    12
    Par défaut
    Merci thelvin d'avoir pris le temps de me corriger et d'avoir apporté ces précisions.
    Bonne continuation.

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

Discussions similaires

  1. Mettre en couleur une partie du texte
    Par thomasdu40 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 06/05/2013, 15h42
  2. Réponses: 3
    Dernier message: 01/10/2012, 09h01
  3. Aide pour mettre en couleur du text.
    Par gabuuzz dans le forum C#
    Réponses: 4
    Dernier message: 22/08/2009, 16h38
  4. Mettre en couleurs un texte en fonction de sa valeur.
    Par yann123456 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/02/2008, 16h34
  5. Réponses: 3
    Dernier message: 24/02/2006, 12h30

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