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 :

[XSL] Déplacement de l'information


Sujet :

XSL/XSLT/XPATH XML

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [XSL] Déplacement de l'information
    .

    J'ai un fichier XML qui me sert de template : il contient une page XHTML et un peu plus loin les données à replacer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <page>
     
    <html>
    <head><titre><mova:titre /></titre></head>
    <body>...</body>
    </html>
     
    <mova:titre>leTitre</mova:titre>
     
    </page>
    Maintenant voici le fichier XSL. Il est un peu compliqué, mais les lignes qui me posent problème sont indiqué par "$$$".
    Le code HTML est recopié sans problème. Mais lorsque je rencontre un tag à remplacer, ça ne va plus :


    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
    <?xml version="1.0" encoding="ISO-8859-1" ?>
     
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:html="http://www.w3.org/1999/xhtml" exclude-result-prefixes="html"
    xmlns:mova="http://dynip.org/mova"
    >
     
    <xsl:output
    method="xml"
    indent="yes"
    omit-xml-declaration="yes"
    encoding="ISO-8859-1"
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
    />
     
    <!-- ici on recopie le code html du tag /page/html vers la sortie -->
    <xsl:template match="/page/html:html//html:*">
    <xsl:element name="{local-name()}">
    <xsl:for-each select="attribute::*">
    <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
    </xsl:for-each>
    <xsl:apply-templates />
    </xsl:element>
    </xsl:template>
     
    <!-- ici, on est sensé remplacer les appels /page/html//mova:toto par
    les données /page/mova:toto.
    local-name() c'est justement "toto" -->
    <xsl:template match="/page/html:html//mova:*">
    <xsl:value-of select="concat('/page/mova:', local-name())" /> fache $$$1$$$
    </xsl:template>
     
     
    <xsl:template match="/page/mova:*"></xsl:template> fache $$$2$$$
     
     
    <!-- Ceci recopie les commentaires -->
    <xsl:template match="comment()">
    <xsl:copy />
    </xsl:template>
     
     
    </xsl:stylesheet>
    J'ai deux problèmes :

    §§1§§ : Dans le select, il y a un string, il est donc recopié tel-quel et ce n'est pas ce que je veux. Pourtant je dois bien recopier le local-name() du contexte courant pour que <mova:toto /> dans html aille cherche le contenu de <mova:toto>contenu</mova:toto>

    §§2§§ : Sans cette ligne, le contenu de <mova:toto> est recopié dans la sortie. Or selon moi je ne lui ai jamais demandé de le faire.
    Cette ligne, dont j'aimerais me passer, permet donc d'annuler la sortie.

    Quelqu'un peut-il m'aider ?


    Précision :

    Un exemple particulier qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="/page/html:html//mova:toto">
    <xsl:value-of select="/page/mova:toto" />
    </xsl:template>
    Mais je n'arrive pas à généraliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="/page/html:html//mova:*">
    <xsl:value-of select="concat('/page/mova:', local-name())" />
    </xsl:template>

  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,

    Citation Envoyé par FredOoo
    §§1§§ : Dans le select, il y a un string, il est donc recopié tel-quel et ce n'est pas ce que je veux. Pourtant je dois bien recopier le local-name() du contexte courant pour que <mova:toto /> dans html aille cherche le contenu de <mova:toto>contenu</mova:toto>
    Il s'agit d'un problème XPath. Il faut dans le select exprimer la requête : 'dans les noeuds frères qui suivent l'élément <html>, sélectionner le premier noeud qui porte le même nom local que celui du noeud courant. Cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="/page/html:html/following-sibling::*[local-name() = local-name(current())][1]"/>
    Citation Envoyé par FredOoo
    §§2§§ : Sans cette ligne, le contenu de <mova:toto> est recopié dans la sortie. Or selon moi je ne lui ai jamais demandé de le faire.
    Cette ligne, dont j'aimerais me passer, permet donc d'annuler la sortie.
    Quand le processeur XSLT parcourt l'arbre XML et rencontre un noeud pour lequel il n'existe pas de template défini dans la feuille de style, il exécute des templates par défauts (définis par la norme du W3C). Le template par défaut des éléments se contente de parcourir le contenu de l'élément, jusqu'à arriver aux noeuds texte, dont le template par défaut envoie le contenu vers la sortie. Si ce comportement est indésirable, alors il faut remplacer le template par défaut avec un template vide, comme tu l'as fait.

    Une autre approche consisterait à empêcher le parcours systématique de l'arbre XML et à l'orienter vers les parties qui nous intéressent, en définissant un template pour la racine / et de partir de ce template pour parcourir l'arbre avec des xsl:apply-templates. Mais ça rendrait la feuille de style plus verbeuse qu'actuellement.

    D'autre part, il y a une erreur qui empêchera le XML résultat d'être bien formé : tel que tu as formulé le match de ton template principal, celui qui recopie les balises html, la balise html englobante ne sera pas recopiée. Modifie ce template de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="/page//html:*">
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci. Ca marche !
    J'ai changer une seule ligne, et ça marche.

    Je qualifierais ce problème de résolu, bien qu'il me faille encore un peu de temps avant de la qualifier de bien compris...

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

Discussions similaires

  1. Accéder aux bonnes informations d´un XML à l´aide de XSL et XPath.
    Par Courgette17 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 08/08/2009, 20h47
  2. information XML/ XSL/ Javascript
    Par missd12 dans le forum XML/XSL et SOAP
    Réponses: 20
    Dernier message: 10/07/2009, 10h33
  3. Réponses: 6
    Dernier message: 18/08/2006, 09h11
  4. xsl:translate - quelques informations svp?!
    Par -ADX- dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/05/2006, 10h42
  5. informations XML XSL
    Par ldauchy dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 15/04/2006, 02h06

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