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]Appliquer plusieurs feuilles XSL successivement


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Par défaut [XSL]Appliquer plusieurs feuilles XSL successivement
    Bonjour,

    Ma question est très simple (mais la réponse l'est-elle? ) :
    J'ai 2 feuilles XSL :
    - la première est chargée de transformer un document XML structuré en terme de "métier" (exemple : "client", "commande", "prix") en un document XML structuré en terme de contenu (exemple : "titre1", "titre2", "liste", "note", "annexe", "chapitre", etc.).
    - la seconde est chargée de transformer le document XML structuré en terme de contenu en un document FO, autrement dit, un document XML structuré en terme de mise en page ("marge", "police", "saut de page", "couleur", etc.)

    Ces deux feuilles doivent être appliquées successivement à mon document XML contenant mes données métier, afin de generer un document FO. Mes contraintes sont les suivantes:
    1) J'aimerais faire un seul appel à mon processeur XSLT. En effet il est executé via un fichier ".bat" et donc deux appels signfiraient deux chargements du run-time java, ce qui est moyen en terme de performance.
    2) Je ne souhaite pas fusionner mes deux feuilles XSL en une seule : je veux pouvoir les conserver dans 2 fichiers differents pour des raisons évident de "couplage faible/cohérence forte" (i.e. les rôles sont bien repartis : une feuille est responsable pour le contenu, l'autre pour la mise en page).

    Quelles sont les solutions qui s'offrent à moi ?
    J'avais pensé génerer (à l'execution) une troisième feuille XSL qui ferait un "import" des deux autres et un "apply-templates", mais n'y a-t-il pas plus simple/propre/performant ?

    Merci d'avance,

    Tcho,

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Par défaut Html et Css
    Salut,

    Ma réponse va te sembler un peu à côté de la plaque : mais pourqoui ne pas utiliser directement du Css avec ta première page Xml transformée.
    Beaucoup de gens pensent que le Css ne fonctionne qu'avec le Html. Pour "police, marge et couleur" tu as Css 1 et pour "mise en page" tu as Css 2.

    Pour un exemple simple de Xml formaté Css :

    http://www.atelierweb.ma/suivante.asp?n=9&id=xexemple1

    Zr.

  3. #3
    Membre éclairé Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Par défaut
    Merci bien pour la réponse (après une semaine, je commençais un peu à desesperer).

    Pour "police, marge et couleur" tu as Css 1 et pour "mise en page" tu as Css 2.
    D'accord, mais Css permet-il de generer du fo (formating object) ? Car, suite à mes 2 transformations, mon but etait de generer un pdf avec FOP (mais c'est vrai que ce n'était précisé dans mon post).

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Par défaut reponse
    Salut,

    D'accord, mais Css permet-il de generer du fo (formating object) ?
    Non, mais au niveau du rendu écran (pour d'autres supports, j'en doute), je ne pense pas qu'il y ait beaucoup de différences avec un formatage Xsl-fo. Si tu ne veux lancer qu'un thread pour faire les deux opérations (transformation + formatage), je ne vois pour l'instant que la fusion des 2 feuilles de styles. Mais je continue à réfléchir sur la question.

    Zr.

  5. #5
    Membre éclairé Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Par défaut
    Mais je continue à réfléchir sur la question.
    Merci beaucoup

    Pour ce qui est du rendu écran je ne doute pas qu'il y ait peu de differences entre css et xsl-fo; mais il se trouve que je suis en train de developper un "moteur de reporting" (désolé, c'est un peu pompeux comme terme). Je pense que xsl-fo est plus adapté dans ce cas là (mise en page de docs papier).

    De mon coté, la seule solution à peu près satisfaisante que j'ai trouvé est de recompiler FOP en ayant modifié le code pour qu'il accepte en paramètre plusieurs feuilles XSL (ou un fichier contenant les feuilles XSL à appliquer). Le problème est que ça m'oblige à recompiler à chaque sortie d'un correctif ou d'une nouvelle version de FOP. Donc si tu as une autre solution, je suis preneur.

    Merci encore,

    Phil

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Par défaut Reponse
    Salut,

    Je te propose deux canevas de solutions : l'une avec Xsl et l'autre par programmation. La première consiste comme tu l'as dis dans ton premier post à créer une troisième feuille de style et à importer les deux feuilles de style. Ensuite tu appelles des templates nommés avec deux éléments <xsl:call-template>. C'est théorique : en pratique, je sais pas ce que ça donne : j'ai pas testé.

    Solution 1

    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="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:import href="jetransforme.xsl"/>
    <xsl:import href="jeformate.xsl"/>
     
    <xsl:template match="....">
         <xsl:call-template name="abc"/>
         <xsl:call-template name="xyz"/>
    </xsl:template>
     
    </xsl:stylesheet>
    Pour la feuille xsl de transformation, rien de particulier sauf qu'il faut rajouter un attribut name="abc" au template englobant.

    Pour la feuille xsl-fo de formatage, il fait rajouter l'espace de noms xsl (j'ai vu ça dans un bouquin) parce que les éléments xsl-fo sont englobés dans un template nommé "xyz". Le résultat est qq chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/Transform" xmlns:fo="http://www.w3.org/1999/Format">
     
    <xsl:template name="xyz">
       <fo:page-sequence master...>
        .....
       </fo:page-sequence>
    </xsl:template>
    </xsl:stylesheet>

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Par défaut Reponse 2
    Solution2

    D'après ce que j'ai compris dans tes posts, tu travailles avec Java. Je travaille pour ma part avec Asp/Asp.Net. C'est pour cela que je propose juste un canevas.

    Après la première transformation, il s'agit de sauvegarder le résultat. Soit tu stockes ce résultat dans une variable chaîne et tu concatènes une extension ".xml" avant de sauvegarder (solution bidouille) et tu lances la deuxième tranformation. Soit tu regardes dans la doc de java si tu peux sauvegarder directement le résultat dans un fichier Xml. Le nom de fichier de sauvegarde peut éventuellemnt être fourni en argument.
    Si tu ne veux pas sauvegarder le fichier Xml résultant, tu peux aussi bien voir si le résultat stocké dans la variable (une version sérialisée) peut être appliqué tel quel pour appliquer la deuxième transformation (je pense que c'est possible avec Asp.net). Dans les deux cas, il faut pouvoir instancier dans le code le processeur Xsl-fo (jamais vu dans Asp.net mais je continue à chercher).

    Zr.

  8. #8
    Membre éclairé Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Par défaut
    Tout d'abord, merci de consacrer un peu de ton temps à mes petits problèmes.

    Tes deux solutions sont à peu près celles auquelles j'avais moi-même aboutit (les grands esprits se rencontrent ). J'ai quelques remarques :
    Solution1 :
    <xsl:call-template name="abc"/>
    <xsl:call-template name="xyz"/>
    Je ne pense pas que ce code puisse fonctionner puisque, même si tu appelles les deux templates à la suite l'une de l'autre, elles travaillent quand même toutes les deux sur le même arbre source. Autrement dit, la sortie de la première template n'est pas redirigée dans l'entrée de la seconde. Je suppose que ce que tu as voulu dire est plutot qqchose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:variable name="toto">
         <xsl:call-template name="abc"/> 
    </xsl:variable>
         <xsl:call-template name="xyz" select="$toto"/>
    Avec eventuellement un appel à nodeset() lors du deuxième appel si on est en XSL 1.0.

    Le problème c'est que si la sortie du 1er XSL fait plusieurs dizaines de Mo, je me demande si c'est une bonne idée de la mettre dans une variable.


    Solution2 :
    Je ne travaille pas en Java mais en Delphi. C'est pour cela que, comme indiqué dans mon premier post, je lance Xalan via un fichier ".bat" (si je travaillais en java, je l'aurais bien evidemment appelé directement depuis mon code). Toutefois Xalan étant openSource je pense que je peux modifier légèrement le main() pour qu'il accepte plusieurs feuilles XSL plutot qu'une seule (avec genration d'un fichier xml intermediaire). Pour l'heure, c'est la solution vers laquelle je pense me diriger.

    Merci pour tes propositions,

    Phil

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Par défaut Bien vu
    Salut,

    Pour la solution 1, c'est très juste. Bien vu.

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

Discussions similaires

  1. Appliquer plusieurs xsl sur un seul xml
    Par miled dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/05/2011, 09h24
  2. [XSL] 1 feuille XSL et plusieurs XML
    Par fredcvn dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 22/04/2010, 14h11
  3. Appliquer un seul XSL à plusieurs XML
    Par Jeune_Informaticien dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 19/02/2010, 00h51
  4. Réponses: 36
    Dernier message: 14/08/2008, 16h37
  5. [XSL] Application d'un XSL pour produire un XSL... help
    Par Greedo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 22/05/2003, 11h30

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