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[(_at_)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(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com]On Behalf Of
Caranthir
Morifinwë
Sent: Sunday, December 21, 2003 5:48 PM
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] 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[(_at_)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