Your example didn't provide $productId. You were on the right track,
but using this method is much cleaner.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="total" match="Substance" use="productId"/>
<xsl:template match="ProductList">
<xsl:for-each select="Substance[productId[not(. =
preceding::productId)]]">
<xsl:sort select="Substance/productId"/>
<xsl:value-of select="concat(productId, ': ')"/>
<xsl:value-of select="concat(sum(key('total',
productId)/num), ' ')"/><br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
-----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
Biying Huang
Sent: Thursday, January 22, 2004 10:56 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Cc: btusdin(_at_)mulberrytech(_dot_)com
Subject: [xsl] matching the first following sibling
Dear All,
I have trouble with matching the first following sibling which has a
child's value differ from the current one's.
I need my output look like this:
3000: 9
5000: 5
4000: 8
But I can only get the first line, 3000 : 9
Here is my xslt:
<xsl:template match="ProductList">
<xsl:apply-templates select="Substance[position() = 1 ]" />
</xsl:template>
<xsl:template match="Substance">
<xsl:value-of select = "productId"/>
:
<xsl:value-of select = "sum( num |
following-sibling::Substance[productId = $productId ]/num)" />
<!-- now check if there is another unique product, if so, call this
template recursively, but this DOES NOT work -->
<xsl:apply-templates select="following-sibling::Substance[productId
!= ./productId and position() = 1 ]" />
</xsl:template>
I have this xml data:
<ProductList>
<Substance>
<productId>3000</productId>
<num>3</num>
</Substance>
<Substance>
<productId>4000</productId>
<num>4</num>
</Substance>
<Substance>
<productId>3000</productId>
<num>3</num>
</Substance>
<Substance>
<productId>5000</productId>
<num>5</num>
</Substance>
<Substance>
<productId>4000</productId>
<num>4</num>
</Substance>
<Substance>
<productId>3000</productId>
<num>3</num>
</Substance>
</ProductList>
Thanks in advance for your help.
Biying Huang
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list