xsl-list
[Top] [All Lists]

RE: Not-repeated elements in an <xsl:for-each>

2003-12-21 20:00:57
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



<Prev in Thread] Current Thread [Next in Thread>