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 :

Utiliser moins de templates


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Utiliser moins de templates
    Bonjour,

    J'utilise plusieurs templates que j'appelle ensuite une seule fois dans mon template principal.

    Je me demandais comment intégrer le code de mes templates secondaires dans mon template principal.

    Par exemple, j'ai un template qui ajoute le noeud:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="/office:document/office:meta/meta:document-statistic" name="add-meta-user-defined">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        <xsl:element name="meta:user-defined">
            bonjour!
        </xsl:element>
    </xsl:template>
    Que j'appelle ensuite dans mon template principal avec le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:call-template name="add-meta-user-defined"/>
    À ma connaissance, on ne peut pas créer un template dans un template...

    Et le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:for-each select="/office:document/office:meta/meta:document-statistic" name="add-meta-user-defined">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        <xsl:element name="meta:user-defined">
            bonjour!
        </xsl:element>
    </xsl:for-each>
    donne un résultat inattendu.

    Comment faire pour intégrer correctement le code souhaité?

    Je vous remercie par avance...

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    moi je pense que tous ces codes produisent exactement le résultat que j'attends.

    Peut-être pourrais-tu nous dire pourquoi pour toi, c'est inattendu ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Je crois que je ne comprends pas bien <xsl:for-each/> ni <xsl:apply-templates/>.

    Lorsque j'écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <exsl:document
        href="{$FilePath}">
        <xsl:for-each select="office:meta/meta:document-statistic">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
            <xsl:element name="meta:user-defined">
                bonjour!
            </xsl:element>
        </xsl:for-each>
        <xsl:apply-templates/>
    </exsl:document>
    Il me met le <xsl:element name="meta:user-defined"/> dans <office:meta/> juste après <meta:statistic/>, comme il faut; par contre il supprime les autres <meta:user-defined/> du document...

    Et lorsque j'écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <exsl:document
        href="{$FilePath}">
        <xsl:for-each select="/office:document/office:meta/meta:document-statistic">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
            <xsl:element name="meta:user-defined">
                bonjour!
            </xsl:element>
        </xsl:for-each>
        <xsl:apply-templates/>
    </exsl:document>
    Donc en mettant un chemin absolu à select="", il me met le <xsl:element name="meta:user-defined"/> au tout début du document, juste après <?xml version="1.0"?>

    Ce que je voudrais, c'est ajouter et retrancher des noeuds à différents endroits de mon document, et ne pas changer le reste.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Huuum, ça a pas beaucoup de sens.

    Il semble que tu essaies de créer une copie à peine modifiée du fichier XML source, à l'aide de <exsl:document>. Mais alors il y a deux choses qui me paraissent pas claires :

    • Pourquoi utiliser <exsl:document> ?

      Prendre un fichier XML source et produire un fichier XML destination, c'est le fonctionnement de base de XSLT. Il n'y a pas besoin de <exsl:document> pour ça et du coup je ne comprends pas où tu veux en venir.
    • Tu essaies de faire une copie, mais tu ne copies pas les balises de base comme <office:document> ou <office:meta>...

      Du coup ça va servir à quoi ? Je trouve ça bizarre.



    En tout cas je ne suis pas habitué à <exsl:document>, mais il est possible qu'il s'attende à créer un vrai document XML bien formé, auquel cas ça ne va pas lui plaire que tu crées des balises sans les chapeauter d'un élément racine comme c'est obligatoire en XML. Et du coup il aura peut-être un comportement imprévisible, d'où résultats différents en fonction de comment tu t'y prends pour sélectionner les éléments, ce qui devrait en principe rester sans effet mais peut avoir des effet quand on se place dans un état interdit.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ha! Ha! J’ai trouvé le bug.

    Dans <exsl:document/>, si j’écris <xsl:apply-templates/>, ou si j’appelle un template qui contient <xsl:apply-templates/>, il applique tous les templates de la feuille de style. D’où le résultat étrange…
    J’utilise la fonction document() et l’extension <exsl:document/>, pour écrire une feuille de styles multi-input et multi-output.

    Ainsi, j’utilise dans mon template principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="document($SourceFilePath)">
    $SourceFilePath étant une variable, il peut représenter plusieurs documents en input.

    Puis à l’intérieur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <exsl:document href="{$ResultFilePath}">
    <!-- ??? -->
    </exsl:document>
    Le code pour transformer chacun des inputs en output.

    D’après la documentation: «Le contenu de <exsl:document/> est un template».

    Toute la question est de savoir comment ajouter ou retrancher un nœud dans ces conditions, sans modifier le reste.

    Merci de tes réponses, elle m’aide à mieux comprendre mon problème.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je commence à croire qu'il y a un truc fondamental que tu as pas compris, ou c'est juste une façon de parler ?

    XSLT ne permet pas d'ajouter ou retrancher des nœuds.
    Il crée de nouveaux documents, du début, entièrement. <exsl:document> ne modifie pas de document existant, il en crée un nouveau à partir de rien. Il n'y aura, à la fin, que ce que tu auras décidé de mettre dedans.
    Alors certes, <xsl:copy> est une manière d'ajouter un élément en ajoutant simplement une copie de l'élément en cours. Mais bon, ça reste un ajout, que tu indiques en mettant <xsl:copy> en lieu et place de ne rien faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [MySQL] Récupérer valeur d'un select en utilisant systeme de template
    Par Blade dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/11/2008, 10h43
  2. Utilisation avancée des templates
    Par olivier2019 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 03/04/2008, 14h26
  3. utilisation d'une template css comme Master page
    Par phpieur dans le forum ASP.NET
    Réponses: 1
    Dernier message: 30/04/2007, 10h42
  4. [XSLT] utilisation d'un template ?
    Par ghohm dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 11/09/2006, 17h37
  5. Utilisation d'un template avec une map
    Par bonano dans le forum Langage
    Réponses: 6
    Dernier message: 09/08/2006, 21h26

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