Re: [xsl] Recursive counting

Subject: Re: [xsl] Recursive counting
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Tue, 18 Jul 2006 22:19:49 -0400
At 2006-07-18 21:18 -0400, I wrote:
At 2006-07-18 17:24 -0400, Steve wrote:
Well after success with my first recursive template I was all set to
make one of my own, but now shamefully am coming to the list for
advice over something that appears quite simple.

XML ------->
...

Desired output ------->
<!-- @count corresponds to number of times
the preference appeared among the list of <people> --->

..

Stipulation: --------->

<out>'s must be sorted alphabetically, regardless of <option> order.

I'm not sure why you are using recursion ... I hope the following helps. BTW, I think your desired output count was wrong for the third item.

Here is a version that uses keys ... there was no need to use the variable method of grouping and for big data sets I believe the answer below will be a lot faster.

I hope this helps.

. . . . . . . . . . Ken

T:\ftemp>type steve.xml
<?xml version="1.0" encoding="US-ASCII"?>
<data>
  <options>
    <o type="A">who</o>
    <o type="A">what</o>
    <o type="A">when</o>
    <o type="B">how</o>
    <o type="B">nexus</o>
    <o type="B">triumph</o>
    <o type="C">alligator</o>
    <o type="C">spurn</o>
  </options>
  <people>
    <person pref="who" />
    <person pref="nexus" />
    <person pref="how" />
    <person pref="alligator" />
    <person pref="spurn" />
    <person pref="triumph" />
    .... etc ....
  </people>
</data>

T:\ftemp>type steve.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="1.0">

<xsl:output indent="yes"/>

<xsl:key name="options" match="o" use="@type"/>
<xsl:key name="prefs" match="person" use="@pref"/>

<xsl:template match="/data">
  <output>
    <xsl:for-each select="options/o[generate-id(.)=
                                    generate-id(key('options',@type)[1])]">
      <xsl:sort select="@type"/>
      <out type="{@type}"
           count="{count(key('prefs',key('options',current()/@type)))}"/>
    </xsl:for-each>
  </output>
</xsl:template>

</xsl:stylesheet>
T:\ftemp>xslt steve.xml steve.xsl con
<?xml version="1.0" encoding="utf-8"?>
<output>
   <out type="A" count="1"/>
   <out type="B" count="3"/>
   <out type="C" count="2"/>
</output>
T:\ftemp>

--
Registration open for UBL training:    Montrial, Canada 2006-08-07
Also for XSL-FO/XSLT training:    Minneapolis, MN 2006-07-31/08-04
Also for UBL/XML/XSLT/XSL-FO training: Varo,Denmark 06-09-25/10-06
World-wide corporate, govt. & user group UBL, XSL, & XML training.
G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0    +1(613)489-0999 (F:-0995)
Male Cancer Awareness Aug'05  http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal

Current Thread