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] xsl:copy-of ou bien xsl:apply-templates


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Par défaut [XSLT] xsl:copy-of ou bien xsl:apply-templates
    Bonjour,
    J'ai un fichier XML qui contient disons quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <toto>
        blabla
        <m:math>blabla</m:math>
        blabla
        <bob>blabla</bob>
        blabla
    </toto>
    Je veux le transformer en un fichier XHTML de sorte que tout le contenu de toto soit restitué tel quel (en particulier <m:math>blabla</m:math> qui est du MATHML) sauf <bob>blabla</bob> qui doit subir une transformation.

    Or si j'essaye dans toto un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:copy-of select="."/>
    mon code MATHML s'affiche bien mais évidemment bob n'est pas transformé.

    Tandis que si j'essaye dans toto un :
    bob est transformé mais mon MATHML n'est plus correctement recopié.

    Que faire ?

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Ce qu'il faut faire, c'est <xs:apply-templates/>, mais il faut penser à faire

    - un template sur bob,
    - un template sur tout ce qui doit subir un traitement particulier,
    - un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xs:template match="*|@*">
      <xs:copy>
        <xs:apply-templates select="*|@*"/>
      </xs:copy>
    </xs:template>
    Pour copier tout le reste tel que (en appliquant les traitements particuliers de bob à leurs enfants bob.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Par défaut
    Merci, mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xs:template match="*|@*">
      <xs:copy>
        <xs:apply-emplates select="*|@*"/>
      </xs:copy>
    </xs:template>
    ne me donne que les attributs de <m:math> et de ses enfants.

    J'ai aussi essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xs:template match="*|@*">
      <xs:copy>
        <xs:apply-templates/>
      </xs:copy>
    </xs:template>
    qui me donne tout sauf les attributs !

    Comment faire pour que les <m:math>blabla</m:math> soient intégralement copiés ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Ah, pardon, j'ai pas assez testé ce que je disais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xs:template match="node()|@*">
      <xs:copy>
        <xs:apply-templates select="node()|@*"/>
      </xs:copy>
    </xs:template>
    Devrait mieux marcher.

    (Ça marche aussi avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xs:template match="*|@*">
      <xs:copy>
        <xs:apply-templates select="@*"/>
        <xs:apply-templates/>
      </xs:copy>
    </xs:template>
    )
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Par défaut
    Ça marche ! Merci Thelvin.

    PS. Pourquoi "xs:" et pas "xsl:" dans le code ?

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par pbernard Voir le message
    PS. Pourquoi "xs:" et pas "xsl:" dans le code ?
    Pourquoi pas ? Ce n'est qu'un préfixe.

    Personnellement, je préfère garder des préfixes très courts. Même, quand c'est pas trop gênant, je le mets carrément en namespace par défaut.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    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
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Pourquoi pas ? Ce n'est qu'un préfixe.

    Personnellement, je préfère garder des préfixes très courts. Même, quand c'est pas trop gênant, je le mets carrément en namespace par défaut.
    Attention dangereux !!!

    Certains processeur xslt (peut rigoureux mais cela existe), semble avoir "bloqué" le préfixe xsl.
    En gros si une feuille xslt est utilisé avec un autre préfixe (même avec le namespace correctement déclaré), les instruction ne seront pas reconnues

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Je confirme, en effet. Depuis que j'ai vu ça, j'utilise toujours le préfixe xsl.

    Puisque l'usage semble être d'utiliser xsl et que maintenant certains outils nous forcent à cet usage, il ne serait pas malin de chercher les ennuis, et il vaut mieux s'y tenir.

    Mais bon, c'est pas moi qui me trompait, ce sont eux.
    Personne (qui soit en position de le faire) n'a jamais dit que le préfixe devait être xsl. Et d'ailleurs, personne n'a jamais dit qu'il fallait forcément un préfixe (mais la plupart du temps c'est plus simple avec.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [XSLT] traitement de chaine via Variable et apply-templates
    Par jdriele dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/11/2010, 10h08
  2. Réponses: 2
    Dernier message: 28/11/2009, 23h20
  3. [XSLT] Supprimer saut de ligne dans un xsl:copy
    Par chris1024fr dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 29/09/2009, 17h34
  4. [XSLT] xsl:sort + apply-templates
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 04/10/2007, 17h52
  5. [xsl] alterner de style entre deux apply-template
    Par laouache dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 23/04/2004, 11h49

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