[Home] [By Thread] [By Date] [Recent Entries]
Here is another possible solution (using node-set extension function):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:common="http://exslt.org/common"
exclude-result-prefixes="common"
version="1.0"><xsl:output method="xml" indent="yes"/> <xsl:key name="by-type" match="contact" use="@type" /> <xsl:template match="/x">
<totals>
<xsl:variable name="rtf">
<xsl:for-each select="contacts/contact[generate-id() =
generate-id(key('by-type', @type)[1])]">
<temp><xsl:value-of select="count(key('by-type', @type)) *
../../types/type[@value = current()/@type]/@benchmark1" /></temp>
</xsl:for-each>
</xsl:variable>
<benchmark val="{sum(common:node-set($rtf)/temp)}" />
</totals>
</xsl:template></xsl:stylesheet> When the above stylesheet is applied to the following XML: <?xml version="1.0"?>
<x>
<types>
<type value="1" benchmark1="540" />
<type value="2" benchmark1="640" />
<type value="3" benchmark1="740" />
</types>
<contacts>
<contact type="1" />
<contact type="2" />
<contact type="3" />
<contact type="3" />
</contacts>
</x>The output produced is: <?xml version="1.0" encoding="UTF-8"?> <totals> <benchmark val="2660"/> </totals> On 2/20/07, Steve <stephen@xxxxxxxxx> wrote: I could do the following easily by making a recursive template and then looping through the contacts, and passing on the corresponding benchmark value. But could xsl:key make for a shorter, more elegant solution? -- Regards, Mukul Gandhi
|

Cart



