Salut à tous,

je suis débutant en XSL. Je comprend les bases mais je ne comprend pas ce qui suit : j'essai d'appeler un template à l'intérieur d'un autre template, mais le code HTML n'est pas généré pour le second template (celui qui se trouve à l'intérieur du premier).

Un petit plus de détail :

Je déclare un premier template nommé "BlockGlobal" puis un autre "BlockContent". Jusque la tout va bien. Ensuite je fais un XSL qui appel le premier template pour transformer les données principale du XML, à l'intérieur duquel j'appel le deuxieme template pour transformer les données du noeud enfant.

Et c'est la que ca cloche : je récupère bien les données mais le code HTML du second template n'est pas généré. Comme s'il était ignoré ...

Je sais pas si quelqu'un a dèjà rencontré ce probleme, il manque peut etre juste un detail dans le code ? Sinon y a t'il un autre moyen d'inclure en XSL un template dans un autre template ?

Ci-dessous les codes.

templates.xsl (définition des templates)

<?xml version='1.0' encoding='ISO-8859-1'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://www.xxx.com">
	
	<!-- Template d'un Block -->
	<xsl:template name="BlockGlobal">
		<xsl:param name="Titre"/>
		<xsl:param name="BlockClass"/>
		<xsl:param name="BlockIn"/>

		<div class="Block {$BlockClass}">
			<h2>MON TITRE : <xsl:value-of select="$Titre" disable-output-escaping="yes"/></h2>
			<div class="BlockIn">
				
				<xsl:value-of select="$BlockIn" disable-output-escaping="yes"/>	
						
			</div>
		</div>
		
	</xsl:template>
	<!-- Template d'un Block -->

		
	<!-- Template de Content, se trouve à l'intérieur de BlockIn sous le H2 
		 C'est la présentation qui inclu des colones gauches et droites	-->

	<xsl:template name="BlockContent">
		<xsl:param name="Titre"/>
		
		<div class="Content">
			<div class="Left"><p>IMAGETOTO</p></div>
			<div class="Right">
				<div class="Title"><xsl:value-of select="$Titre" disable-output-escaping="yes"/></div>
				<div class="Text">
					<p>TEXT</p>
				</div>
				<div class="More"><img src="/images/template/lire-la-suite.gif" alt="..." /></div>
			</div>
		</div>
		
	</xsl:template>	

	<!-- Template de Content -->
	
</xsl:stylesheet>



transform.xsl (les xsl de transformation)

<?xml version='1.0' encoding='ISO-8859-1'?>     
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
<xsl:output method="html" indent="yes" encoding="iso-8859-1" />

	<xsl:include href="inc/templates.xsl" />
	<xsl:param name="BlockClass" />

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

	<xsl:template match="itembloc">
		[b]<xsl:call-template name="BlockGlobal">[/b]
			
			<xsl:with-param name="Titre">
				<xsl:value-of select="description" />
			</xsl:with-param>
			
			<xsl:with-param name="BlockClass">
				<xsl:value-of select="$BlockClass"/>
			</xsl:with-param>

			<xsl:with-param name="BlockIn">
				<xsl:apply-templates select="s_itembloc[position()&lt;3]"/>
			</xsl:with-param>

		[b]</xsl:call-template>[/b]

	</xsl:template>		

	<xsl:template match="s_itembloc">

		[b]<xsl:call-template name="BlockContent">[/b]

			<xsl:with-param name="Titre">
				BlockIn
			</xsl:with-param>
			
		[b]</xsl:call-template>[/b]
	</xsl:template>	
	
</xsl:stylesheet>



Merci d'avance pour votre aide !
Modifié par AntiStatic (11 Mar 2006 - 16:32)
Bonjour,

Sans le fichier XML, c'est difficile de faire un test, mais à la lecture rapide du code, tu donnes vraiment l'impression de vouloir défier la pesanteur : un template qui appelle un template qui appelle un template (BlockGlobal) qui prend en paramètre le résultat d'un template qui appelle un template (BlockContent). Ouf !

C'est un peu lourd à débugger. Je crois que si BlockGlobal se contentait d'appeller directement BlockContent, et si tu retirais les templates qui ne font qu'appeler un unique autre template, ça pourrait éclaircir l'horizon.

Mais si tu n'obtiens pas ce que tu souhaites c'est uniquement parce que ton code XSL n'est pas en osmose avec le XML de départ (que l'on ne connaît pas). En essayant de jouer aux devinettes, je soupçonne l'expression select="s_itembloc[position()<3]" de ne rencontrer aucun noeud.
Salut Xavier !

en fait tu as bien compris !Sauf que tu rajoute un peu trop de template Smiley smile Je veux juste avoir un template Global qui peut appeler d'autres templates de présentation. Ce qui fait un template qui utilise un autre template. Mais c'est que si je pouvais utiliser un template qui appel un autre puis un autre etc etc ca serait top, du moins dans l'idée que je veux developper.

Par conte le select="s_itembloc[position()<3]" renvoi bien 3 items, le seul probleme. En réalité le seul probleme, c'est qu'il renvoi ces items mais sans le code HTML du template BlockContent. Je pense que cela vient du fait que le code < xsl:apply-templates select="s_itembloc[position()&lt;3]" / > renvoi juste les valeur de s_item sans appliquer le template.

Quant à appeler le template BlockContent directement dans blockGlobal cela revient pour moi à faire un seul template ...

Si tu as d'autres idées ca m'interesse !
a écrit :
tu rajoute un peu trop de template
Sauf erreur j'ai fait l'exacte description de ton code.
a écrit :
Je veux juste avoir un template Global qui peut appeler d'autres templates de présentation
C'est bien ce que permet XSLT, et ce que tout un chacun souhaite réaliser. Et la façon naturel est que le template global fasse un xsl:call-template. Ton idée d'appeler un template avec un parametre qui prend pour valeur le résultat d'un autre template est étrangement complexe.
a écrit :
le select="s_itembloc[position()<3]" renvoi bien 3 items,
Je veux bien te croire, mais sans le XML personne ne pourra verifier Smiley smile .
a écrit :
En réalité le seul probleme, c'est qu'il renvoi ces items mais sans le code HTML du template BlockContent
Si tu obtiens des items de XML source sans la mise en forme attendue de BlockContent c'est que ce sont les templates par défaut de XSLT qui s'appliquent et non pas ton template a toi. Je maintiens donc que ton expression Xpath n'est pas correcte relativement au contexte dans lequelle elle s'applique.
a écrit :
Quant à appeler le template BlockContent directement dans blockGlobal cela revient pour moi à faire un seul template
Absolument pas, c'est tout le contraire
Salut Xavier,

en fait j'ai compri pourquoi le template a l'intérieur d'un autre template ne renvoi pas de code HTML. Tout simplement parce que je les utiliser mal. Cad que j'essayer de passer directement du code HTML dans le fichier de transformation. Alors qu'en réalité il faut uniquement passer les parametres !

Le pb vient du fait que les < et > (inférieur et supérieur) n'etait pas interprétés à l'intérieur d'un call-template, donc forcement aucun code HTML ne sortait. Il y a bien la solution qui consiste a les remplacer par leur équivalent en code HTML : & lt; et & gt; mais bon cette méthode est plutot crade, voir carrement, et le code devient vite indubitable.

Pour conclure maintenant je peux appeler autant de templates que je veux sur autant de niveaux que je veux et c'etait le résultat que je voulais avoir ! La solution consiste a faire passer uniquement des parametres a l'intérieur des call-template. Si bien que du coup j'ai mes templates totalement séparés des fichiers de transformations qui ne contiennent que les valeurs des XML ! La classe Smiley cligne

En tout cas merci pour ton aide Xavier !