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

Utilisation de la librairie redirect [Résolu][XSLT] - XML/XSL - Programmation

Marsh Posté le 15-07-2008 à 15:35:11    

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
Reply

Marsh Posté le 15-07-2008 à 15:35:11   

Reply

Marsh Posté le 16-07-2008 à 15:44:51    

Personne pour m'aider? :(

Reply

Marsh Posté le 17-07-2008 à 09:18:31    

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...  
 

Reply

Marsh Posté le 17-07-2008 à 09:55:10    

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.

Reply

Marsh Posté le 17-07-2008 à 10:07:12    

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
Reply

Marsh Posté le 17-07-2008 à 10:23:10    

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
Reply

Marsh Posté le 17-07-2008 à 10:49:01    


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?

Reply

Marsh Posté le 17-07-2008 à 11:45:17    

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:

Reply

Marsh Posté le 17-07-2008 à 13:10:59    

Pas de quoi :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed