Bonjour à tous,

J'ai un script Ajax qui récupère un fichier XML et un fichier XSL et les transforme en XHTML. Il fonctionne correctement mais j'ai des problèmes avec la transformation XML/XSL.

J'ai crée le fichier XML suivant où les balises inbriquées dans "contenu" sont affichés selon un ordre définit par pos="X".


[...]


<centre>
	<bloc>
		<titre>Titre</titre>
		<contenu>
			<paragraphe pos="1">
				<texte>Texte</texte>
			</paragraphe>
			
			<r_ligne pos="2"></r_ligne>
			
			<paragraphe pos="3">
				<texte>Texte</texte>
			</paragraphe>
		</contenu>
	</bloc>
</centre>



Le fichier XSL associé :

[...]

<xsl:template match="centre"> 
	<xsl:apply-templates select="bloc" />
</xsl:template>



<xsl:template match="bloc"> 
	<div class="bloc">
		<p class="h2"><xsl:value-of select="titre" /></p><br/>
		<xsl:apply-templates select="contenu" />
	</div>
</xsl:template>



<xsl:for-each match="contenu">
<xsl:sort select="@pos" data-type="number" /> 	
	<xsl:apply-templates select="paragraphe" />	
	<xsl:apply-templates select="r_ligne" />		
</xsl:for-each>



<xsl:template match="paragraphe">
	<p><xsl:value-of select="texte" /></p>	
</xsl:template>



<xsl:template match="r_ligne"> 
	<br />
</xsl:template>



</xsl:stylesheet>


Dans ce code, tout fonctionne parfaitement. Cependant, ma mise en page est plus complexe, j'ai donc rajouté d'autres éléments dans "paragraphe".


Le XML est donc devenu le suivant (changement dans le premier paragraphe) :


[...]

<centre>
	<bloc>
		<titre>Titre</titre>
		<contenu>
			<paragraphe pos="1">
				<texte ord="1">Début Texte </texte>
				<rs_mf ord="2">Texte mis en forme</rs_mf>
				<texte ord="3">	Fin Texte</texte>
			</paragraphe>
			
			<r_ligne pos="2"></r_ligne>
			
			<paragraphe pos="3">
				<texte ord="1">Texte 1</texte>
			</paragraphe>
		</contenu>
	</bloc>
</centre>



J'ai également modifié le XSL en respectant la même logique que lorsque cela fonctionnait :


<xsl:template match="centre"> 
	<xsl:apply-templates select="bloc" />
	<xsl:apply-templates select="bloc_fin" />	
</xsl:template>



<xsl:template match="bloc"> 
	<div class="bloc">
		<p class="h2"><xsl:value-of select="titre" /></p><br/>
		<xsl:apply-templates select="contenu" />
	</div>
	
	<img class="image" src="doc/img7.jpg" alt="" />
</xsl:template>



<xsl:template match="bloc_fin"> 
	<div class="bloc">
		<p class="h2"><xsl:value-of select="titre" /></p><br/>
		<xsl:apply-templates select="contenu" />
	</div>
</xsl:template>



<xsl:for-each match="contenu">
<xsl:sort select="@pos" data-type="number" /> 	
	<xsl:apply-templates select="paragraphe" />	
	<xsl:apply-templates select="r_ligne" />		
</xsl:for-each>



<xsl:template match="paragraphe">
<xsl:sort select="@ord" data-type="number" /> 
	<p>
	<xsl:apply-templates select="texte" />
	<xsl:apply-templates select="rs_mf" />
	</p>	
</xsl:template>



<xsl:template match="r_ligne"> 
	<br />
</xsl:template>



<xsl:template match="texte"> 
	<xsl:value-of select="." />
</xsl:template>



<xsl:template match="rs_mf"> 
	<span class="green"><strong><xsl:value-of select="." /></strong></span>
</xsl:template>



</xsl:stylesheet>


Mais maintenant, le script ne fonctionne plus alors que j'ai suivit le même processus. Lorsque je click sur le lien qui active la fonctino Ajax, plus rien ne s'affiche.

Si quelqu'un à la solution à ce problème,
LoK.
Bonjour,

Je ne comprends pas la logique de ta transfomation, car dans le code que tu présentes, ton élément <xsl:for-each match="contenu"> ne se trouve dans aucun template. Ceci n'est pas accepté par le langage XSL.

Tu as probablement oublié de mentionner une partie de ta transformée ?
Je ne comprend pas très bien ce que tu veux dire. "<xsl:for-each match="contenu">" est appelé par l'intermédiare du template bloc ("<xsl:apply-templates select="contenu" />").
LoK a écrit :
"<xsl:for-each match="contenu">" est appelé par l'intermédiare du template bloc ("<xsl:apply-templates select="contenu" />").
C'est un rêve. Dans la réalité apply-templates appelle un template et rien d'autre.

Par ailleurs ton élément <xsl:for-each match="contenu"> est fils actuellement de <xsl:stylesheet> ce qui n'est pas possible.
Dans mon premier exemple, c'est également le cas mais tout fonctionne correctement. Smiley eek
LoK a écrit :
Dans mon premier exemple, c'est également le cas mais tout fonctionne correctement. Smiley eek
Personnellement, je doute qu'une transformée XSLT puisse être exécutée correctement si elle comporte un élément xsl:for-each fils de xsl:stylesheet. Pour t'en convaincre, ce chapitre de la norme xslt 1.0 donne la liste des fils autorisés sous xsl:stylesheet. Ces éléments sont appelés Top Level Elements. Tu pourras vérifier que xsl:template est bien un Top Level Element alors que xsl:for-each est de la catégorie Instruction. Cette situation persiste en XSLT 2.0.

Je te conseille de rectifier cette anomalie, puis si un problème persiste, de publier ton nouveau code pour que l'on puisse tester éventuellement.
Je remonte ce sujet que j'avais laissé de coté par manque de temps pour programmer.

J'ai revu ma transformée grâce à ce tutoriel et maintenant tout fonctionne cependant j'ai encore besoin d'une petite précision. Smiley cligne


Je n'arrive pas à utiliser correctement le "use-attribute-sets" de la balise éléments donc, je me retrouve à écrire des codes types :

<xsl:template match="mf">
	<span>
		<xsl:attribute name="class">
			<xsl:value-of select="@class" />
		</xsl:attribute>

		<xsl:apply-templates/>
	</span>
</xsl:template>


pour simplement affecter une balise span et un style à un texte. Je pense que cetté écriture peut se simplifier grâce à la balise "element" :

<xsl:element name="nomelement" use-attribute-sets=""> </xsl:element>


Cependant, je n'arrive pas utiliser correctement "use-attribute-sets". Si quelqu'un à un exemple de fonctionnement ?

Merci,
LoK.