|
Subject: Re: [xsl] job for xsl:key? (XSL 1.0 question) From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx> Date: Tue, 20 Feb 2007 22:49:34 +0530 |
<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: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><?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><?xml version="1.0" encoding="UTF-8"?> <totals> <benchmark val="2660"/> </totals>
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?
Instead of performing an addition for each <contact>, could I simply sum() them at once, somehow?
With the following XML
<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>
desired output:
<totals> <benchmark val='2660' /> </totals>
-- Regards, Mukul Gandhi
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] job for xsl:key? (XSL 1.0, David Carlisle | Thread | Re: [xsl] job for xsl:key? (XSL 1.0, Steve |
| Re: [xsl] MSXML w:p tag causing pro, Jay Bryant | Date | [xsl] Re: job for xsl:key? (XSL 1.0, Steve |
| Month |