[XSL] Créer et utiliser des balises après coup

Salut à tous !

Le XSL c’est magique, mais un peu comme les regexp, on chope un niveau de fou quand on pratique , et on oublie tout aussi vite.
Du coup, je galère à faire une opération et je me demande même si c’est possible en XSL.

Xml d’entrée :

<documents> <doc-content name="a4"> <file-tag name="toto"/> </doc-content> <doc-content name="a5"> <file-tag name="tata"/> </doc-content> <doc-content name="a6"> <file-tag name="titi"/> </doc-content> <doc-content name="a7"> <file-tag name="toto"/> </doc-content> <doc-content name="a8"> <file-tag name="titi"/> </doc-content> </documents>

Xml voulu en sortie

<documents> <folder name="toto"> <doc-content name="a4"/> <doc-content name="a7"> </folder> <folder name="tata"> <doc-content name="a5"/> </folder> <folder name="titi"> <doc-content name="a6"/> <doc-content name="a8"> </folder> </documents>

Je pense qu’en 2 passes c’est possible, mais en une passe, j’ai vraiment des doutes…

Des idées messieurs ?

Merci d’avance !

moi je dirais :

[code] <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version=« 2.0 » xmlns:xsl=« http://www.w3.org/1999/XSL/Transform » xmlns:xsi=« http://www.w3.org/2001/XMLSchema-instance » xmlns:xs=« XML Schema » xmlns:fn=« http://www.w3.org/2005/xpath-functions » exclude-result-prefixes=« fn xs xsi xsl »>

<xsl:output method=« xml »
indent=« yes »
omit-xml-declaration=« yes »/>

		<xsl:template  match="/documents">
			<documents>
			  <xsl:for-each-group  select="doc-content/file-tag"
						  group-by="@name">
				   <xsl:variable name="var_cur_result_groupby" as="xs:string" select="current-grouping-key()"/>
				   <folder>
						 <xsl:attribute name="name">
							 <xsl:value-of select="current-grouping-key()"/>
						 </xsl:attribute>
												 <xsl:for-each select="/documents/doc-content">
						<xsl:if test="file-tag/@name=$var_cur_result_groupby">
						 <doc-content>
							 <xsl:attribute name="name">
							 <xsl:value-of select="@name"/>
						 </xsl:attribute>
						 </doc-content> 
						</xsl:if>
						</xsl:for-each>
					</folder>
			  </xsl:for-each-group>
			  </documents>
		</xsl:template>

</xsl:stylesheet>[/code]

Voila monsieur

J’avoue que le <xsl:for-each select="/documents/doc-content"> est un peu violent mais bon :slight_smile:

Impecc ! Ca marche nickel.

J’ai oublié de préciser que j’avais des contraintes XSLT 1, mais au final, j’ai switché mes libs Java pour du Saxon et porifter de la surpuissance du XSLT 2.

Merci Yaltar. Comme d’hab, tu roxx des poneys en short.