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:
				
<xsl:template match="citation"><!-- plusieurs citations par documents -->
...
<redirect:write select="$cheminCitations"
					append="true">
					<section role="{$composant}">
						<para role="{$refEval}" id="{$version}" />
					</section>
				</redirect:write>
...
</xsl:template>


Voici un bout du fichier produit:
<?xml version="1.0" encoding="UTF-8"?>
<section xmlns:f2lt="urn:f2lt"
	xmlns:ooo="http://openoffice.org/2004/office"
	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
	role="ASE_REQ.1">
	<para id="3.0" role="ST" />
</section>
<?xml version="1.0" encoding="UTF-8"?>
<section xmlns:f2lt="urn:f2lt"
	xmlns:ooo="http://openoffice.org/2004/office"
	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
	role="ASE_REQ.1">
	<para id="6.0" role="ST" />
</section>
<?xml version="1.0" encoding="UTF-8"?>
<section xmlns:f2lt="urn:f2lt"
	xmlns:ooo="http://openoffice.org/2004/office"
	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
	role="ASE_REQ.2">
	<para id="3.0" role="ST" />
</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:
<?xml version="1.0" encoding="UTF-8"?>
<article>
	<section role="ASE_REQ.1">
		<para id="3.0" role="ST" />
		<para id="6.0" role="ST" />
	</section>
	<section role="ASE_REQ.2">
		<para id="3.0" role="ST" />
	</section>
</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.
Modifié par samalairbien (17 Jul 2008 - 15:58)
samalairbien a écrit :

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


Le premier point vient d'être résolu. Smiley biggrin En fait, il fallait utiliser les balises <redirect:open> et <redirect:close>. 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:


			<!-- CORPS DU DOCUMENT -->
			<office:body>
				<office:text>
					<redirect:open select="$cheminCitations" />
					<!-- 					<redirect:write select="$cheminCitations">
						<section>
						</redirect:write>
					-->
					<xsl:apply-templates>
						<xsl:with-param name="level" select="0" />
					</xsl:apply-templates>

					<!-- 					<redirect:write select="$cheminCitations">
						</section>
						</redirect:write>
					-->
					<redirect:close select="$cheminCitations" />
				</office:text>
			</office:body>
		</office:document>

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

<?xml version="1.0" encoding="UTF-8"?>
<section xmlns:f2lt="urn:f2lt"
	xmlns:ooo="http://openoffice.org/2004/office"
	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
	role="ASE_REQ.1">
	<para id="3.0" role="ST" />
</section>
<section xmlns:f2lt="urn:f2lt"
	xmlns:ooo="http://openoffice.org/2004/office"
	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
	role="ASE_REQ.1">
	<para id="3.0" role="ST" />
</section>
<section xmlns:f2lt="urn:f2lt"
	xmlns:ooo="http://openoffice.org/2004/office"
	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
	role="ASE_REQ.1">
	<para id="4.0" role="ST" />
</section>


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> (ou <article>) à l'ouverture et le tag </section> (ou </article>) 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 < et > 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="<section>" /> 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.
Problème résolu: il suffisait tout simplement de faire
<redirect:write>
<section>
<xsl:apply-templates />
</section>
</redirect:write>

dans le motif de l'élément racine.