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 :

XPATH XSL Récursif (très débutant!)


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 XPATH XSL Récursif (très débutant!)
    Bonjour,
    je viens de me mettre au XML et je dois effectuer un remplacement de caractères suédois dans tous les champs de mon doc XML.
    En sachant que l'arbre de mon doc peut varier énormément selon la génération de celui-ci, je souhaiterais savoir s il est possible d'executer de manière récursive des fonctions sur tous les noeuds (et sous noeuds) d'un doc?

    Je m interesse a Xpath pour cela mais pour le moment je n y comprend pas grand chose au XSL et XPATH
    merci de m'aider

    voila ce que g fait pour le moment (c pas tres folichon je sais )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    	<xsl:variable name="List_swedish_From_Char" select="åÅäÄöÖüÜ"/>
    	<xsl:variable name="List_swedish_To_Char" select="aAaAoOuÜ"/>
     
    <xsl:template name="Replace_swedish_spec_char" >
    <xsl:for-each select=current()></xsl:for-each>
    	<xsl:value-of select=current() ></xsl:value-of>
    </xsl:template>
     
    </xsl:stylesheet>

  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,

    Qu'appelles-tu champ, exactement ? S'il s'agit du contenu textuel de tes noeuds, éléments ou attributs, ca ne pose pas trop de souci, même si ce n'est pas trivial. S'il s'agit également de transcrire le nom de tes éléments (balises), là c'est plus du tout la même chose !
    Sachant qu'un flux XML est un flux texte (attention à l'encodage), je te conseillerais, si c'est possible, de programmer une simple fonction de rechercher/remplacer dans le langage de ton choix et de laisser XSL de côté pour l'instant.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  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
    je suis obligé de le faire en XSL,
    car c un traitement effectué sur un fichier XML déja généré et qui plus est, avec des balises qui changent de nom

    Il s'agit effectivement de la valeur des champs.
    La difficulté pour moi étant de parser le fichier XML de manière récursive afin d'exécuter une fonction replace sur la valeur de tous les noeuds du fichier

    Qq un a une idée?

  4. #4
    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 : 47
    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
    c'est le meme pb qu'ici je pense(du moins une idee assez proche)
    http://www.developpez.net/forums/viewtopic.php?t=228517
    non?
    (utilisation de la fonction translate('abc','ABC'),d'un apply-templates select="node()|@*")
    Je vois pas ce que le recursif viens faire la,il suffit de copier tout l'arbre en modifiant des caracteres

  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
    désolé je suis pas expert en la matière...pour le moment le XSL ne me parle pas bcp, je trouve ça même tres complexe
    en tout cas merci je vais regarder ça

  6. #6
    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
    désolé je suis pas expert en la matière...pour le moment le XSL ne me parle pas bcp, je trouve ça même tres complexe
    Rassure-toi, ca nous a fait à tous la même chose la première fois...
    Je vois pas ce que le recursif viens faire la,il suffit de copier tout l'arbre en modifiant des caracteres
    Là, t'es un peu vache, Erwy... Pas vraiment trivial, surtout pour un débutant en XSLT, non ?

    Voici ce que je ferais personnellement. Ca remplace les caractères partout, y compris dans les noms de balises et d'attributs et c'est indépendant de la structure du flux XML. Par contre, ca ne traite pas les commentaires et les processing instructions - à faire en exercice )
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
      <xsl:output method="xml" indent="yes"/>
     
      <xsl:template match="/">
        <!-- On démarre par les éléments... -->
        <xsl:apply-templates select="*"/>
      </xsl:template>
     
      <xsl:template match="*">
        <!-- on traduit le nom de l'élément -->
        <xsl:variable name="newName">
    	  <xsl:call-template name="traduction">
    	    <xsl:with-param name="texte" select="name()"/>
    	  </xsl:call-template>
    	</xsl:variable>
    	<!-- On s'occupe des éventuels attributs de l'élément -->
    	<xsl:apply-templates select="@*"/>
    	<!-- On restitue en sortie l'élément avec son nouveau nom et son contenu -->
    	<xsl:element name="{$newName}">
    	  <!-- Récursivité -->
    	  <xsl:apply-templates/>
    	</xsl:element>
      </xsl:template>
     
      <xsl:template match="@*">
        <!-- on traduit le nom de l'attribut -->  
        <xsl:variable name="newName">
    	  <xsl:call-template name="traduction">
    	    <xsl:with-param name="texte" select="name()"/>
    	  </xsl:call-template>
    	</xsl:variable>
    	<!-- On restitue en sortie l'attribut avec son nouveau nom et son contenu -->	
    	<xsl:attribute name="{$newName}">
    	  <!-- on n'oublie pas de traduire la valeur de l'attribut ! -->
          <xsl:call-template name="traduction">
            <xsl:with-param name="texte" select="."/>
    	  </xsl:call-template>
    	</xsl:attribute>
      </xsl:template>
     
      <xsl:template match="text()">
        <!-- on traduit les noeuds textuels -->
        <xsl:call-template name="traduction">
    	  <xsl:with-param name="texte" select="."/>
    	</xsl:call-template>
      </xsl:template>
     
      <xsl:template name="traduction">
        <!-- Fonction générique de traduction -->
        <xsl:param name="texte"/>
    	<xsl:value-of select="translate($texte,'1','2')"/>    
    	<!-- <xsl:value-of select="translate($texte,'åÅäÄöÖüÜ','aAaAoOuU')"/> -->
      </xsl:template>
     
    </xsl:stylesheet>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    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
    Bah moi je vais prendre un café et essayer de comprendre tout ça...
    an tout cas merci bcp pour l aide ça a dut te demander un gros effort!
    c gros comme truc

    voila ou moi j en était avec Xpath
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    	<xsl:variable name="List_swedish_From_Char" select="åÅäÄöÖüÜ"/>
    	<xsl:variable name="List_swedish_To_Char" select="aAaAoOuÜ"/>
     
    	<xsl:template match="/">
    		<xsl:for-each select="//*">
    			<!--xsl:element name="name(self)">-->
    				<xsl:value-of select= "translate(current(), 'åÅäÄöÖüÜ', 'aAaAoOuÜ')"/>
    			<!--</xsl:element>-->
    		</xsl:for-each>
    	</xsl:template>
    </xsl:stylesheet>
    bizarrement il m envoit en sorti que les valeurs de mes noeuds concaténés entre eux... comprends pas
    mais je crois que je vais me cooncentrer sur ton exemple
    Il ne m est pas nécessaire de tranfiquer le nom des noeuds mais juste leur valeur
    merci encore

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsl:apply-templates select="@*"/
    ...comprend pas la

  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
    an tout cas merci bcp pour l aide ça a dut te demander un gros effort!
    Pas vraiment : un petit quart d'heure (le temps de faire une petite pause et changer un peu du PHP et du SQL...) Non pas que je sois génial (quoique... ), mais c'est qu'une fois que tu as compris le principe et que tu as pas mal manipulé, ca vient tout naturellement; c'est pas aussi compliqué que ca en a l'air.
    c gros comme truc
    Par rapport à ce que tu aurais du écrire en Java (ou autre langage) pour faire la même chose, je ne trouve pas.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  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
    qq questions pour ceux qui comprendront:

    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <xsl:template match="@*">
    ne faut il pas mettre de nom aux templates?

    2/ Est ce qu au moment de l appel tous les templates sont executé?

    3/ Avec ce code je ne comprend pas comment on fait pour boucler sur ts les noeuds du doc... ça m'echappe completement!

    Pour le moment je n y comprend pas grand chose, ça change tellement des langages de prog habituels ...je suis completement perdu.
    Help plz

  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 : 47
    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
    Citation Envoyé par GrandFather
    Là, t'es un peu vache, Erwy... Pas vraiment trivial, surtout pour un débutant en XSLT, non ?
    ca se voulait pas vache mais etant en vacances j'ai pas mes sources sous la main, j'ai demandé a quelqu'un qui les avait peut etre mais il a du passer apres toi
    1/Code:
    <xsl:template match="@*">

    ne faut il pas mettre de nom aux templates?
    non,les nom ne sont utiles que pour les templates nommées qui sont appelés avec un call-templates.
    Pour les autres 2 solutions
    -soit tu as un unique comportement pour un type de balise:le cas ici,et tu n'as rien besoin de specifie de plus c'est le processeur qui au fur et a mesure du parsage des noeuds selectionnes dans l'apply-templates decidera des regles a applique
    -soit tu as plusieur comportement et dans ce cas la tu specifie l'attibut mode="un_nom" de l'apply et de la template,et il n'effectuera que les templates qui ont le mode specifie(ou pas de mode du tout si ma memoire est bonne : )

    2/ Est ce qu au moment de l appel Code:
    <xsl:apply-templates/>

    tous les templates sont executé?
    Oui et non
    -tu peux en avoir des indesirables:si tu n'as pas specifie de ton propre chef certaines templates sur cetains type de noeuds des templates par defaut vont se lancer,instruction a n'utiliser que lorsque tu maitrise bien
    -il me semble qu'il y a peut etre un probleme avec les templates sur les noeuds attributs,d'ailleurs dans le code de grandfather il lance un appel particulier pour les attributs @*
    3/ Avec ce code je ne comprend pas comment on fait pour boucler sur ts les noeuds du doc... ça m'echappe completement!
    c'est simple le select="*" selectionne tous les fils du noeud courant et comme dans chaque noeu on fait un apply templates a nouveau....

  12. #12
    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
    Bonne explication, je pense avoir compris
    Mais qd je fais template match="*" et que j'effectue des opérations de remplacement sur les chaînes de caractères ...en Output je ne retrouve que le texte, j ai perdu tous les noeuds (les balises en somme)
    Ce que je veux c "traffiquer" les valeurs des noeuds mais les noueds doivent rester là

  13. #13
    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
    ce que je veux dire c qu il doit forcément y avoir un moyen simple pour ne pas être obliger de recréer des éléments au fur et à mesure du parsage du XML
    Simplement dire "pour tous les noeuds fils de / je voudrais que les valeurs soient traitées"

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

    ce que je veux dire c qu il doit forcément y avoir un moyen simple pour ne pas être obliger de recréer des éléments au fur et à mesure du parsage du XML
    Pas avec XSLT. Le principe d'une transformation avec XSLT est de prendre un flux XML et de le transformer en autre chose selon les instructions d'une feuille de style écrite en XSLT. Cet autre chose peut être du XML, du XHTML, du texte pur ou même du binaire. Le XML en sortie n'est pas la finalité de la transformation XSLT mais une possibilité parmi d'autres.

    XSLT n'est peut-être pas le plus indiqué dans ton cas. Si tu veux manipuler un arbre en intervenant sur les feuilles (le texte) sans toucher aux noeuds (les éléments), DOM conviendrait peut-être plus. DOM est implémenté dans pratiquement tous les langages, tu n'as que l'embarras du choix (C++, C#, Java, Python, VB...).
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  15. #15
    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
    je programme en VB...jamais entendu parlé de cette API...bizarre

    G lu qq chose sur le DOM et SAX mais je ne sais meme pas comment installer quoi que se soit pour y faire appelle
    Vais chercher, merci

Discussions similaires

  1. Chargement de textures sur OPENGL (très débutant)
    Par alcibiade dans le forum OpenGL
    Réponses: 4
    Dernier message: 07/01/2009, 01h22
  2. Réponses: 7
    Dernier message: 10/11/2006, 13h11
  3. Très débutant en C sur Macos X
    Par clampin dans le forum C
    Réponses: 2
    Dernier message: 27/04/2006, 12h13
  4. [XPATH] [XSL] Result tree fragment
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/11/2005, 11h30
  5. Très débutant : je n'arrive pas à faire fonctionner le JDK
    Par miltonis dans le forum Général Java
    Réponses: 20
    Dernier message: 19/10/2005, 21h20

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