xsl-list
[Top] [All Lists]

RE: Obtaining sums

2004-08-16 12:28:08
From: michael(_dot_)s(_dot_)eberhart(_at_)verizon(_dot_)com

I can't seem to figure out how to get a list of sums for each state.


This kind of question used to get asked more often than it does now.
Maybe the FAQs are working!

The data looks like this:

<LEVEL name="AB">
      <TYPE name="MK001">
            <STATE name="MAINE">91</STATE>
            <STATE name="ALASKA">73</STATE>
            <STATE name="OHIO">128</STATE>
      </TYPE>
...
</LEVEL>


This is a grouping problem.  With xslt 1.0 you have to use one or
another  trick to group all the entries for a particular state together
so they can be summed.  The most common trick is to use a key and
generate-id to create a list of unique items - state names in this case.
Then you can sum them all.  Rather than critique your code, I'll just
show you how this other way looks -

<xsl:variable name='states' select='/LEVEL/TYPE/STATE'/>
<xsl:key name='states' match='STATE' use='@name'/>

<!-- Here we find the first of all states with the same name -->
<xsl:variable name='unique-states' 
        select='/LEVEL/TYPE/STATE[generate-id() =
generate-id(key("states",@name)[1])]'/>
        
<xsl:template match="/LEVEL">
<results>
        <xsl:for-each select='$unique-states'>
                <xsl:variable name='state-entries' 
                        select='$states[(_at_)name = current()/@name]'/>
                <sum state='{(_at_)name}'>
                        <xsl:value-of select='sum($state-entries)'/>
                </sum>          
        </xsl:for-each>
</results>
</xsl:template>

The output should appear as:

MAINE ALASKA      OHIO
219   158         176


I didn't format it this way but you can modify the templates to get it.
BTW, when you send in a request for help, please try to remove
extraneous things, like all that html code.

Also BTW, you have a probably typo in the key name "LEVLE-KEY" (which I
assume you use somewhere else).

Cheers,

Tom P


<Prev in Thread] Current Thread [Next in Thread>
  • Obtaining sums, michael . s . eberhart
    • RE: Obtaining sums, Passin, Tom <=