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] trier un arbre à partir d'un attribut


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut [XSLT] trier un arbre à partir d'un attribut
    salut, g un fichier XML du type
    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
    <MONXML>
    <ELEMENT att="TRUE">
         <SOUS_NOEUD>Texte quelquonque</SOUS_NOEUD>
        <..../>
    </ELEMENT>
     
    <ELEMENT>
         <SOUS_NOEUD>ReTexte quelquonque</SOUS_NOEUD>
        <..../>
    </ELEMENT>
    <ELEMENT att="FALSE">
         <SOUS_NOEUD>Texte quelquonque</SOUS_NOEUD>
        <..../>
    </ELEMENT>
    </MONXML>
    le but est de récupérer en output les éléments n'ayant pas d'attribut att="TRUE" (ou pas d'att tout court)
    :

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    le but est de récupérer en output les éléments n'ayant pas d'attribut att="TRUE" (ou pas d'att tout court)
    Attention, selon qu'on recherche les éléments ayant un attribut dont la valeur est différente de TRUE, ou qu'on cherche les éléments sans attributs, la commande XPath ne sera pas la même.

    Dans le 1er cas, ca sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /MONXML/ELEMENT[@att != 'TRUE']
    Dans le second :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /MONXML/ELEMENT[not(@*)]

  3. #3
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    petit bémol sur l exemple que g mis qui n est pas assez significatif et je m en excuse car l ennoncé du coup est faussé

    j'ai plusieurs champs de noms différents qui ont ou pas un attribut att="TRUE" ou pas d'attribut att ou d'autres attributs (d un autre nom)
    le truc est que je voudrais faire un template du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:template match="*">
      <xsl:if...   un attribut du noeud  courant s appelle att et est = TRUE alors je ne prend pas ds l'output
      />
    </xsl:template>
    ps: g bien conscience de poser bcp de questions sur ce forum
    mais le XSL est vraiment trop déconcertant pour moi, je n y comprend vraiment rien pour le moment..c tres inhabituel
    merci encore

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Dans ce cas, le template devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template select="*[@att != 'TRUE']"/>...</xsl:template>
    Tous les éléments ayant un att égal à TRUE sont filtrés et ne passent donc pas par ce template.
    mais le XSL est vraiment trop déconcertant pour moi, je n y comprend vraiment rien pour le moment..c tres inhabituel
    C'est déconcertant pour tout le monde au début. Le problème est que rien n'est intuitif, l'expérience acquise avec des langages de prog conventionnels ne sert à rien, sauf avec Prolog ou d'autres langages déclaratifs, peut-être, et encore... Je te conseille vivement la lecture d'un bon bouquin (<pub>O'reilly en a d'excellent sur la question</pub>) et les tutoriaux présents sur le net. Une fois les bases assimilées, tu pourras vraiment te rendre compte de la richesse et des possibilités de XSLT.
    En attendant, bon courage !

  5. #5
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut bouquin xsl
    je suis en train de lire
    O'Reilly - XSLT - Mastering XML Transformations

    personnelement je le trouve pas très bien fait, les exemples sont trop longs et compliqués
    ce que je trouve inhabituel ds la collection o reilly

  6. #6
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    pour récupérer tous mes éléments, je dois les reconstruire?
    à savoir récupérer leur nom, attributs et valeur?

    voila ce que g écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    <!--Se place sur root-->
    <xsl:template match="/">
    	<xsl:apply-templates/>
    </xsl:template>
     
    <!-- filtre tous les elements pour retirer ceux qui ont un attribut ISNAT!=TRUE-->
    <xsl:template match="*[@ISNAT !='TRUE']">
    	<xsl:apply-templates/><!--Récursivité-->
    </xsl:template>
     
    </xsl:stylesheet>
    ...ce qui ne me sort que du texte, une seule ligne avec la valeur de ts les éléments

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Le XSLT - Mastering XML Transformations écrit par Doug Tidwell !?
    C'est mon livre de référence sur XSLT, presque mon livre de chevet. Je le trouve au contraire plutôt pas mal, enfin en tout cas la version américaine. Peut-être que la traduction française n'est pas à la hauteur ?
    Du côté du net, je te conseille l'excellent site du groupe Zvon :
    http://www.zvon.org

  8. #8
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    le problème des tutoriaux c qu ils montrent absoluement tous des exemple pour transformer du XML en texte alors que ce qui m'intéresse c de transformer du XML en manipulant les noeuds, en en ajoutant, retirant
    mais pour garder du XML a la fin

    ds mon dernier post ce que je ne comprend pas c pourquoi je ne récupère pas les noeuds en sachant que (je pense) avoir demandé tous les éléments en dessous de root qui contiennent un attribut

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    <xsl:apply-templates/> sans attribut 'select' cherche à appliquer un template à tous les noeuds fils du noeud courant, que ce soit les éléments, les noeuds texte ou les commentaires (les noeuds attributs doivent eux être explicitement sélectionnés pour être traités par un template). Quand ce template existe, il est exécuté ; quand il n'existe pas, ce sont les templates par défaut qui sont activés (pour leur liste, voir le bouquin d'O'reilly ).

    Le template par défaut pour les éléments (*) ne fait que parcourir l'arbre d'entrée XML sans recopier les noeuds. Si tu veux recopier l'élément dans l'arbre de sortie, tu dois le demander explicitement avec xsl:copy.

    Le template par défaut pour les noeuds texte se contente lui d'envoyer le texte en sortie. C'est pour cela que tu as une ligne avec les valeurs concaténées.

    Maintenant, la syntaxe exacte des templates à écrire va dépendre de ce que tu veux : un exemple d'entrée et de sortie permettrait de t'aiguiller plus précisement.

  10. #10
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut Etat d avancement des travaux
    apres avoir beaucoup testé et encore testé j'en suis arrivé au code suivant
    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
    <!--Se place sur root-->
    <xsl:template match="/">
    	<xsl:apply-templates/>
    </xsl:template>
     
    <!-- filtre tous les elements pour retirer ceux qui ont un attribut ISNAT!=TRUE-->
    	<xsl:template match="*">
    		<xsl:choose>
    			<!-- qd on a un attribut @ISNAT on ne fait rien-->
    			<xsl:when test="@ISNAT"></xsl:when>
    			<xsl:otherwise><!-- sinon on copie et on réapplique le template-->
    				<xsl:copy>
    					<xsl:apply-templates/>	
    				</xsl:copy>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>	
    </xsl:stylesheet>
    Ce Code filtre bien tous les éléments en ne laissant passer que ceux qui n ont pas d'attribut ISNAT (ce qui est suffisant, pas besoin de tester la valeur pour l instant)
    Mon problème: si un élément recopié a un ou des attributs, ceux ci ne sont pas recopié
    Alors , pourquoi (histoire de comprendre) et aussi comment :

    Merci bcp

  11. #11
    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 Re: Etat d avancement des travaux
    Citation Envoyé par tiscars
    Mon problème: si un élément recopié a un ou des attributs, ceux ci ne sont pas recopié
    Alors , pourquoi (histoire de comprendre) et aussi comment :

    Merci bcp
    la commande xsl:copy ne prend jamais les attributs
    si tu veux les copiers il te faudra un code comme celui de
    http://www.developpez.net/forums/viewtopic.php?t=236229

    tu enleve la traduction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      <xsl:template match="@*"> 
          <xsl:attribute name="{$newName}"> 
         <xsl:value-of select=".">
       </xsl:attribute> 
      </xsl:template>

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

Discussions similaires

  1. [XSLT] Trier par attribut
    Par Bibi51 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/12/2010, 10h41
  2. [XSLT]problème d'appel de texte dans une balise à partir d'un attribut
    Par docteur chépère dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/01/2007, 10h57
  3. [XSLT] - Trier un fichier sur plusieurs critères
    Par ytse dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2005, 16h26
  4. [XSLT] Créer un tableau à partir de sa description
    Par Skyou dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 20/03/2005, 20h01
  5. trier un arbre de structures
    Par mmueve dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/01/2005, 17h37

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