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] supprimer element text


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut [XSLT] supprimer element text
    Bonjour et bonne année à tous,

    Je rencontre un problème xslt je voudrais masquer xsl:text dans un arborescence de résultat xslt, j'ai beaucoup de mal à manipuler ce language. Voici mes deux fichiers


    Fichier Arbo.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
     
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="ArboSpy.xslt"?>
    <racine>
    	<repertoire nom="XML" date-modif="25-02-2001" heure-modif="14:12">
    		Ressource XML (exemples, outils, portail, spécifications...) 
    			<repertoire nom="exemples" date-modif="25-02-2001" heure-modif="14:12">
    				Exemple de fichier XML
    			</repertoire>
    			<fichier nom="seminaire.xml" taille="2" unite-taille="Ko" date-modif="25-02-2001" heure-modif="09:12">
    				Description XML du cours CXML
    			</fichier>
    			<fichier nom="ArboSpy.xml" taille="1" unite-taille="Ko" date-modif="25-02-2001" heure-modif="14:12"/>
    			<repertoire nom="outils" date-modif="25-03-2001" heure-modif="18:22"/>
    	</repertoire>
    	<repertoire nom="Schema" date-modif="19-02-2001" heure-modif="19:09">
    			<repertoire nom="DTD" date-modif="25-02-2001" heure-modif="09:12">
    				Ressources sur les DTD
    				<repertoire nom="outils" date-modif="25-02-2001" heure-modif="19:56"/>
    				<fichier nom="XMLSpy35.exe" taille="8" unite-taille="Mo" date-modif="28-02-2001" heure-modif="12:12">
    					Version d'évaluation auto-installable 
    				</fichier>
    				<fichier nom="cooktop_2_101.msi" taille="4" unite-taille="Mo" date-modif="25-02-2001" heure-modif="09:45">
    					CookTop (éditeur XML, XSLT, DTD) gratuit au fromat MS Installeur. 
    				</fichier>
    			</repertoire>
    			<repertoire nom="XML Schema" date-modif="25-02-2001" heure-modif="14:12"/>
    	</repertoire>
    	<fichier nom="ebXML-Specv1-0.pdf" taille="246" unite-taille="Ko" date-modif="25-02-2001" heure-modif="14:12">
    		Spécification ebXML à ranger dans un répertoire. 
    	</fichier>
    </racine>
    Fichier ArboSpy.xslt

    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
     
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
    			<!-- formatage de l'arboresence -->
    	<xsl:template match="racine">
    		<xsl:for-each select="child::*">
    				<xsl:choose>
    					<xsl:when test="self::fichier">
    						<a href="#"><xsl:value-of select="@nom"/></a><br/>
    					</xsl:when>
    					<xsl:otherwise>
    							<xsl:value-of select="@nom"/><br/>
    					</xsl:otherwise>
    				</xsl:choose>
    			<xsl:apply-templates select="self::*"/>
    		</xsl:for-each>			
    	</xsl:template>	
     
    	<xsl:template match="repertoire">
    		<xsl:for-each select="child::*">
    				<xsl:choose>
    					<xsl:when test="self::fichier">
    						<a href="#"><xsl:value-of select="@nom"/></a><br/>
    					</xsl:when>
    					<xsl:otherwise>
    							<xsl:value-of select="@nom"/><br/>
    					</xsl:otherwise>
    				</xsl:choose>
    		</xsl:for-each> 
    	</xsl:template>
    </xsl:stylesheet>

    Le résultat obtenu : (normallement dans le navigateur avec des leins hypertext aux noeuds fichier)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    XML
    exemples
    seminaire.xml
    ArboSpy.xml
    outils
    Schema
    DTD
    XML Schema
    ebXML-Specv1-0.pdf
    Spécification ebXML à ranger dans un répertoire
    Le résultat souhaité (normallement dans le navigateur avec des leins hypertext aux noeuds fichier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    XML
    exemples
    seminaire.xml
    ArboSpy.xml
    outils
    Schema
    DTD
    XML Schema
    ebXML-Specv1-0.pdf
    J'ai essayer en faisant dans le premier template <xsl:template match="//*">, mais ça me supprime les liens hypertext, ensuite j'ai essayé avec xsl:if du genre <xsl:if test ="node() != text()">, mais ça fonctionne pas, Comment puis-je lire test dans "l'instruction if" pour savoir ce qu'il renvoie précisément...

    je présice que ces fichiers sont des tests, juste pour me permettre de manipuler ce language. Après ce test réussit j'utiliserais un fichier css, pour formater les balises.

    Donc si vous pouviez m'aider pour masquer les elements text, ça sera cool !

    Merci d'avance

    dav79

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je comprends pas trop ta logique, mais le plus simple serait d'avoir trois templates :

    un sur repertoire et un sur fichier, pour faire des choses sur les répertoires et les fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:template match="repertoire">
      <!-- faire des trucs pour afficher le répertoire -->
      <!-- gérer la récursivité du contenu du répertoire : -->
      <xsl:apply-templates/>
    </xsl:template>
     
    <xsl:template match="fichier">
      <!-- faire des trucs pour afficher le fichier -->
    </xsl:template>
    Et un pour supprimmer le contenu texte quand appl-templates tombe dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!-- ne rien faire quand on tombe sur un nœud texte -->
    <xsl:template match="text()"></xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Merci Telvin, pour ta réponse et bonne année 2011,

    Le fichier xml, ce n'est pas moi, qui les constitués, c'est TP, je fais une formation XML, avec formaself... Il est vrai que ne maîtrise pas bien les axes modaux : //*, ./, self::*. Je débute en xslt. J'ai beaucoup de mal avec le XPath et xsl:condition, car tous ce que j'essaie ça ne fonctionne pas. Du genre je veux pas afficher les éléments text dans une boucle for-each, mais pourtant ça fonctionne pas du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:for-each select="//racine">
              <xsl:if test ="node() != text()">
                 <xsl:value-of select="/@nom">
              </xsl:if>
     
    </xsl:for-each>
    ça marche pas, ce genre de condition ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Merci beaucoup telvin, je viens d'essayer ta solution en utilisant
    <xsl:template match="text()"></xsl:template> et ça fonctionne bien
    Par contre ce que je ne comprends pas pourquoi cette template s'exécute, alors que je ne l'appel pas. Normallemen on l'appel avec apply-template ou call-template quand c'est une template de nom

    Peut tu m'expliquer pourquoi stp?

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bonne année, bonne santé.

    Citation Envoyé par BOLARD Voir le message
    Le fichier xml, ce n'est pas moi, qui les constitués, c'est TP, je fais une formation XML, avec formaself...
    Ok.

    Citation Envoyé par BOLARD Voir le message
    Il est vrai que ne maîtrise pas bien les axes modaux : //*, ./, self::*. Je débute en xslt. J'ai beaucoup de mal avec le XPath et xsl:condition, car tous ce que j'essaie ça ne fonctionne pas.
    Oui oui, moi non plus je ne suis pas né avec. C'est pour ça qu'avant de me lancer dans des trucs, j'ai commencé par apprendre.
    D'abord le XML. Suivre un apprentissage, apprendre une notion, jouer avec une demi-heure, apprendre une autre notion, jouer avec une demi-heure, puis voir les deux notions ensemble, jouer avec une heure... Recommencer jusqu'à ce qu'on ait vu l'essentiel, et là on commence à faire des vrais trucs.

    Puis le XSLT. Lire le principe théorique, puis apprendre la syntaxe. Une notion, jouer avec, deux notions, jouer avec, combiner les deux, jouer avec...
    C'est très long tout ça, et il y en a même que ça ennuie, mais c'est fou ce que ça marche.

    Alors bon, je me moque, mais je confesse que j'ai jamais trouvé de bon tutoriel pour le XML, ni le XSLT, sur Internet. À la place j'ai lu un livre et pratiqué chaque exercice, mon ordinateur et le livre à côté. Le livre je suis allé le trouver en bibliothèque.

    Citation Envoyé par BOLARD Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:for-each select="//racine">
              <xsl:if test ="node() != text()">
                 <xsl:value-of select="/@nom">
              </xsl:if>
     
    </xsl:for-each>
    ça marche pas, ce genre de condition ?
    Ça veut rien dire, surtout.

    • //racine ne sélectionnera jamais un nœud texte de toute façon, puisque ça sélectionne tous les éléments nommés racine du document.
    • Pour tester si le nœud en cours est un nœud texte, on fait <xsl:if test="self::text()">. Mais en pratique, on ne vérifie jamais si le nœud en cours est un nœud texte : on s'arrange pour ne pas les avoir sélectionnés si on les veut pas.
    • <xsl:value-of select="/@nom"> est toujours vide. Ceci est parce que commencer par / dit de retourner tout en haut, au nœud document, l'ancêtre de tout, parent du nœud racine. Un nœud document n'a pas d'attribut, donc /@nom n'existe pas, ce qui donne vide.


    je viens d'essayer ta solution en utilisant
    <xsl:template match="text()"></xsl:template> et ça fonctionne bien
    Par contre ce que je ne comprends pas pourquoi cette template s'exécute, alors que je ne l'appel pas. Normallemen on l'appel avec apply-template ou call-template quand c'est une template de nom

    Peut tu m'expliquer pourquoi stp?
    <xsl:apply-templates/> s'applique sur tous les nœuds enfants du nœud en cours. Y compris sur les nœuds textes, donc.
    Par défaut, le template d'un nœud texte, c'est comme si le template suivant était défini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="text()">
      <xsl:value-of select="."/>
    </xsl:template>
    En gros, le template d'un nœud texte, c'est de se recopier tel que, sous forme de nœud texte.
    Il est possible de modifier ce comportement par défaut en définissant un <xsl:template match="text()">

    Au fond, c'est pareil pour les éléments : il y a un template par défaut qui dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="*">
      <xsl:apply-templates/>
    </xsl:template>
    Raison pour laquelle apply-templates va chercher tous les descendants, même si au milieu il y a des éléments qui ne sont pas matché par un template. Cela peut s'annuler en le redéfinissant.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Par défaut
    Ok merci Telvin, pour ton aide et tes explications, j'ai peut faire ce que je souhaitais et c'est plus claire dans mon esprit.

    dav79

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

Discussions similaires

  1. [XSLT] Remplacer element d'un fichier xml par du texte
    Par ALAMI2009 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/11/2009, 15h09
  2. [XSLT] Supprimer les caractères spéciaux HTML d'un noeud texte
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/12/2008, 22h59
  3. [XSLT] <xsl:element name="$text" >
    Par DrDam dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/04/2008, 10h29
  4. [XSLT]Récupérer le texte avant et après un élément
    Par MasterOfChakhaL dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 30/07/2007, 09h12
  5. [XSLT] Garder Espaces blancs dans un element texte
    Par batotoba dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 15/08/2006, 20h40

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