Subject: RE: Not-repeated elements in an <xsl:for-each>
From: "Lars Huttar" <lars_huttar@xxxxxxx>
Date: Sun, 21 Dec 2003 21:00:57 -0600
|
Dear Caranthir (by the way ),
This is a classic grouping problem.
Here's a short solution:
<xsl:template match="/root">
<!-- Select the first ship element of each unique type. -->
<!-- This assumes all ships are siblings. -->
<xsl:for-each select="ship[not(preceding-sibling::ship/@type = @type)]">
<xsl:variable name="stype" select="@type" />
<xsl:value-of select="sum(../ship[@type = $stype])" />
</xsl:for-each>
</xsl:template>
If you have a lot of ships, you could use a key (xsl:key) to make this
more efficient.
See the XSL FAQ (http://www.dpawson.co.uk/xsl/sect2/sect21.html I think)
under "Grouping" for more details. Specifically, Meunchian grouping.
Lars
> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of Caranthir
> Morifinwë
> Sent: Sunday, December 21, 2003 5:48 PM
> To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Not-repeated elements in an <xsl:for-each>
>
>
> I wonder if there is some way to get a list of nodes without repeated
> elements, something similitar to de "DISTINCT" clausule in a
> SELECT sentence
> of SQL. I need to do this because i want to show the total sum of many
> attributes from many elements. There is an example xml:
>
> <root>
> <ship type="astropod" num="100"/>
> <ship type="spider" num="150"/>
> <ship type="astropod" num="50"/>
> </root>
>
> If I use the following XSL template:
>
> <xsl:template match="/root">
> <xsl:for-each select=ship/@type>
> <xsl:variable name="stype" select="."/>
> <xsl:value-of select="sum(/root/ship[@type=stype]/@num)"/>
> </xsl:for-each>
> </xsl:template>
>
> i get "150 150 150", repeating the third ship who has the
> same type than first. Is there any way to only get one
> "astropod" type in the list xsl:for-each iterates?
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|