Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1488 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

  [Résolu][XSLT] Utilisation de la librairie redirect

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu][XSLT] Utilisation de la librairie redirect

n°1759703
samalairbi​en
Posté le 15-07-2008 à 15:35:11  profilanswer
 

Bonjour à tous.
 
J'ai une question relative à la librairie redirect de XSL qui permet à une feuille de style d'écrire dans un fichier externe en parallèle du traitement de la sortie. J'arrive bien à écrire dans un fichier externe, mais le problème c'est que la sortie produite n'est pas très lisible (en particulier, ce n'est pas un document xml valide puisqu'elle n'a pas d'élément racine). Voici le but de l'utilisation de redirect: je souhaite relever tous les documents référencés à l'intérieur de l'élément <citation> dans mon fichier xml en entrée de ma feuille de style.
 
Voici le bout de ma feuille de style qui fait allusion à redirect:

Code :
  1. <xsl:template match="citation"><!-- plusieurs citations par documents -->
  2. ...
  3. <redirect:write select="$cheminCitations"
  4.     append="true">
  5.     <section role="{$composant}">
  6.      <para role="{$refEval}" id="{$version}" />
  7.     </section>
  8.    </redirect:write>
  9. ...
  10. </xsl:template>


 
Voici un bout du fichier produit:

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <section xmlns:f2lt="urn:f2lt"
  3. xmlns:ooo="http://openoffice.org/2004/office"
  4. xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
  5. xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
  6. xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
  7. xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
  8. xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
  9. xmlns:xlink="http://www.w3.org/1999/xlink"
  10. xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
  11. xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
  12. xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  13. xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
  14. xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  15. xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
  16. role="ASE_REQ.1">
  17. <para id="3.0" role="ST" />
  18. </section>
  19. <?xml version="1.0" encoding="UTF-8"?>
  20. <section xmlns:f2lt="urn:f2lt"
  21. xmlns:ooo="http://openoffice.org/2004/office"
  22. xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
  23. xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
  24. xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
  25. xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
  26. xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
  27. xmlns:xlink="http://www.w3.org/1999/xlink"
  28. xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
  29. xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
  30. xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  31. xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
  32. xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  33. xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
  34. role="ASE_REQ.1">
  35. <para id="6.0" role="ST" />
  36. </section>
  37. <?xml version="1.0" encoding="UTF-8"?>
  38. <section xmlns:f2lt="urn:f2lt"
  39. xmlns:ooo="http://openoffice.org/2004/office"
  40. xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
  41. xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
  42. xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
  43. xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
  44. xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
  45. xmlns:xlink="http://www.w3.org/1999/xlink"
  46. xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
  47. xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
  48. xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  49. xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
  50. xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  51. xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
  52. role="ASE_REQ.2">
  53. <para id="3.0" role="ST" />
  54. </section>


 
Or, je souhaiterais organiser l'information, de sorte à regrouper les para qui sont dans des sections qui ont le même rôle, de la façon suivante:

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <article>
  3. <section role="ASE_REQ.1">
  4.  <para id="3.0" role="ST" />
  5.  <para id="6.0" role="ST" />
  6. </section>
  7. <section role="ASE_REQ.2">
  8.  <para id="3.0" role="ST" />
  9. </section>
  10. </article>


 
Les deux points impératifs sont:

  • Afficher une seule en-tête <?xml...>
  • Avoir un élément racine <article> qui permette de parcourir ensuite ce document


J'espère que je suis assez clair... Merci d'avance pour votre aide.


Message édité par samalairbien le 17-07-2008 à 11:46:08
mood
Publicité
Posté le 15-07-2008 à 15:35:11  profilanswer
 

n°1760362
samalairbi​en
Posté le 16-07-2008 à 15:44:51  profilanswer
 

Personne pour m'aider? :(

n°1760675
avander
Posté le 17-07-2008 à 09:18:31  profilanswer
 

Je connais pas vraiment cette extension propriètaire qu'est redirect:write mais une recherche rapide me dit qu'il y a aussi un <redirect:open> and <redirect:close> qui permettent de gérer finement l'ouverture des fichiers...  
 

n°1760680
samalairbi​en
Posté le 17-07-2008 à 09:55:10  profilanswer
 

Merci avander, car je connaissais l'existence des deux balises open et close mais tu m'as mis la puce à l'oreille. En effet, chaque instruction write ouvre, écrit et ferme le document. C'est l'ouverture qui provoque l'insertion de <?xml version="1.0" encoding="UTF-8"?>. J'ai donc mis, dans le template d'élément racine de ma feuille xslt le code suivant:
 

Code :
  1. <!-- CORPS DU DOCUMENT -->
  2.   <office:body>
  3.    <office:text>
  4.     <redirect:open select="$cheminCitations" />
  5.     <!--      <redirect:write select="$cheminCitations">
  6.      <section>
  7.      </redirect:write>
  8.     -->
  9.     <xsl:apply-templates>
  10.      <xsl:with-param name="level" select="0" />
  11.     </xsl:apply-templates>
  12.     <!--      <redirect:write select="$cheminCitations">
  13.      </section>
  14.      </redirect:write>
  15.     -->
  16.     <redirect:close select="$cheminCitations" />
  17.    </office:text>
  18.   </office:body>
  19.  </office:document>


Ainsi, le document n'est ouvert qu'une seule fois. Voici donc une partie du fichier citations.xml produit:

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <section xmlns:f2lt="urn:f2lt"
  3. xmlns:ooo="http://openoffice.org/2004/office"
  4. xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  5. xmlns:xlink="http://www.w3.org/1999/xlink"
  6. xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
  7. xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
  8. xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  9. xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
  10. xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
  11. role="ASE_REQ.1">
  12. <para id="3.0" role="ST" />
  13. </section>
  14. <section xmlns:f2lt="urn:f2lt"
  15. xmlns:ooo="http://openoffice.org/2004/office"
  16. xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  17. xmlns:xlink="http://www.w3.org/1999/xlink"
  18. xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
  19. xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
  20. xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  21. xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
  22. xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
  23. role="ASE_REQ.1">
  24. <para id="3.0" role="ST" />
  25. </section>
  26. <section xmlns:f2lt="urn:f2lt"
  27. xmlns:ooo="http://openoffice.org/2004/office"
  28. xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  29. xmlns:xlink="http://www.w3.org/1999/xlink"
  30. xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
  31. xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
  32. xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  33. xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
  34. xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
  35. role="ASE_REQ.1">
  36. <para id="4.0" role="ST" />
  37. </section>


Un de mes problèmes a donc été résolu.
 
Cependant, il reste le problème que ce fichier n'a pas d'élément racine: je ne peux donc pas le parcourir et le lire.
L'idée est d'insérer le tag <section> à l'ouverture et le tag </section> avant la fermeture (-> cf commentaires dans première partie du code). Mais je n'y arrive pas car <section> est interprété comme une balise de ma feuille de style et doit être fermée correctement. J'ai également essayé:
 - avec les caractères &lt; et &gt; au lieu de < et > mais ils apparaissent tel que dans le fichier citations.xml.  
 - avec un <xsl:value-of select="<section>"> mais les caractères < et > ne sont pas permis dans cette construction
 - avec du coup <xsl:value-of select="&lt;section&gt;" /> mais une erreur me dit qu'on ne peut pas insérer de noeuds dans XPath, seulement avec XQuery
 
 Est-ce que quelqu'un a une idée pour insérer l'élément racine? J'espère que oui, car je suis proche du but... Merci.

n°1760687
avander
Posté le 17-07-2008 à 10:07:12  profilanswer
 

samalairbien a écrit :

Merci avander, car je connaissais l'existence des deux balises open et close mais tu m'as mis la puce à l'oreille. En effet, chaque instruction write ouvre, écrit et ferme le document. C'est l'ouverture qui provoque l'insertion de <?xml version="1.0" encoding="UTF-8"?>. J'ai donc mis, dans le template d'élément racine de ma feuille xslt le code suivant:
 
...
 Est-ce que quelqu'un a une idée pour insérer l'élément racine? J'espère que oui, car je suis proche du but... Merci.


 
Regarde cet exemple ça me semble assez proche... http://xml.apache.org/xalan-j/apid [...] irect.html

Message cité 1 fois
Message édité par avander le 17-07-2008 à 10:07:58
n°1760702
samalairbi​en
Posté le 17-07-2008 à 10:23:10  profilanswer
 

avander a écrit :


 
Regarde cet exemple ça me semble assez proche... http://xml.apache.org/xalan-j/apid [...] irect.html


 
Ca n'est pas vraiment proche au sens où, dans cet exemple, l'écriture se fait de manière continue, alors que moi elle se fait en plusieurs fois. Ce que je veux faire et qui me pose problème est ce qui suit:
 

Code :
  1. <redirect:open select="..." />
  2. <redirect:write select="...">
  3. <section>
  4. </redirect:write>
  5. <xsl:apply-templates />
  6. <redirect:write select="...">
  7. </section>
  8. </redirect:write>
  9. <redirect:close select="..." />


 
Or, le tag <section> doit être fermé avant le premier </redirect:write> pour que ma feuille de style soit valide. Et le <xsl:apply-templates /> doit se trouver en dehors de <redirect:write>. Il faut donc trouver un autre moyen de faire la même chose...


Message édité par samalairbien le 17-07-2008 à 10:23:49
n°1760714
avander
Posté le 17-07-2008 à 10:49:01  profilanswer
 


Code :
  1. <redirect:open file="doc3.out"/>
  2.      <redirect:write file="doc3.out">
  3.        <section>
  4.             <xsl:apply-templates>
  5.                 <xsl:with-param name="level" select="0" />
  6.             </xsl:apply-templates>
  7.        </section>
  8.      </redirect:write>
  9.      <redirect:close file="doc3.out"/>


 
Non?

n°1760755
samalairbi​en
Posté le 17-07-2008 à 11:45:17  profilanswer
 

Ah oui en effet c'était aussi simple que ça. Je sais pas pourquoi je croyais que ça ne fonctionnait pas...
 
En tout cas, un énorme merci à toi Avander!  :bounce:  Tu m'as enlevé une gorsse épine du pied... même si tu ne connaissais pas plus que ça la librairie redirect!
 
A bientôt peut-être  :hello:

n°1760802
avander
Posté le 17-07-2008 à 13:10:59  profilanswer
 

Pas de quoi :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

  [Résolu][XSLT] Utilisation de la librairie redirect

 

Sujets relatifs
[Résolu] XSLT : grouper et sommer[Résolu][Batch] handle de la fenêtre active
[résolu]Jointure externe et GROUP BYcompiler les exemples directX [résolu]
[resolu] Ajax et XML. Mon script ne fonctionne pas.[Résolu] lightbox et Flash
[Resolu] Recuperer l'index d'un noeud dans sont parent (DOM).[AS3-résolu] Créer une classe
[Résolu] SQL liste meilleur score pour 1 joueur 
Plus de sujets relatifs à : [Résolu][XSLT] Utilisation de la librairie redirect


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR