Bonjour,

Je cherche à passer d'une structure de ce type :

Code :


<Root>
	<Product Group="group1">
		<Name>Product1</Name>
	</Product>
	<Product Group="group2">
		<Name>Product2</Name>
	</Product>
	<Product Group="group1">
		<Name>Product3</Name>
	</Product>
	<Product Group="group1">
		<Name>Product4</Name>
	</Product>
	<Product Group="group3">
		<Name>Product5</Name>
	</Product>
	<Product Group="group3">
		<Name>Product6</Name>
	</Product>
</Root>
 


à une structure comme ceci :



<Root>
	<Group name="group1">
		<Product>
			<Name>Product1</Name>
		</Product>
		<Product>
			<Name>Product3</Name>
		</Product>
		<Product>
			<Name>Product4</Name>
		</Product>
	</Group>
	<Group name="group2">
		<Product>
			<Name>Product2</Name>
		</Product>
	</Group>
	<Group name="group3">
		<Product>
			<Name>Product5</Name>
		</Product>
		<Product>
			<Name>Product6</Name>
		</Product>
	</Group>
</Root>
 


Comme je ne connais pas les noms de mes groupes à l'avance, ni même leur nombre, je ne vois pas comment faire cela en xslt...

Quelqu'un aurait une idée ?

merci d'avance.

mathmax
J'ai trouvé ceci :


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" />
  <xsl:template match="/">
    <Root>
      <xsl:call-template name="category">
        <xsl:with-param name="path" select="Root/Product[@Group]" />
      </xsl:call-template>    
    </Root>
  </xsl:template>

  <xsl:template name="category">
    <xsl:param name="path" />
    <xsl:param name="category" />
    <xsl:variable name="newcat">
      <xsl:value-of select="$path/@Group" />
    </xsl:variable>
    <xsl:if test="$newcat!=$category and (count($path[1]/preceding: [langue]roduct[@Group=$newcat])=0 or $category='')">
      <Group Group="{$newcat}">
          <xsl:for-each select="Root/Product[@Group=$newcat]">
            <Product>
              <Name>
                <xsl:value-of select="Name"/>
              </Name>
            </Product>
          </xsl:for-each>
      </Group>
    </xsl:if>
    <xsl:variable name="followingNode" select="$path/following: [langue]roduct[@Group]" />
    <xsl:if test="boolean($followingNode)">
      <xsl:call-template name="category">
        <xsl:with-param name="path" select="$followingNode" />
        <xsl:with-param name="category">
          <xsl:value-of select="$newcat" />
        </xsl:with-param>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>


pas très intuitif et assez compliqué pour une chose aussi simple que regrouper des balise... Smiley confus enfin ça marche.
Je serais quand même intéressé par une meilleure façon de faire. Si les pros du xslt veulent se casser les dents sur ce problème... Smiley lol
Modifié par mathmax (01 Oct 2007 - 22:33)