[xsl] Recursion of variable, pt. 2

Subject: [xsl] Recursion of variable, pt. 2
From: "watchstone@xxxxxxxxxxx" <watchstone@xxxxxxxxxxx>
Date: Tue, 10 Jan 2006 16:28:01 GMT
I'm stumped!  I need help with variable recursion based on grouping of
elements.  Thanks for your help...

The specifics:
Hierarchy: Nested <r1>,<r2>,<r3>...
Desired output: (see also below) <cnt> Starting with 1 per grouping of <q>,
adds <cnt> amount to the preceding value of <cnt> per grouping of <q>.  <cnt>
is always at the lowest <r?> level.  I have a stylesheet that will increment
<cnt> nicely, but I want it to start over with "1" when <q> changes.

Sample code:

<?xml version="1.0"?>
<vector>
<r1>
<t>geometry</t>
<r2>
<t>parabola</t>
<r3>
<t>trapezium</t>
<q>1</q>
<cnt>4</cnt>
</r3>
<r3>
<t>rhombus</t>
<q>1</q>
<cnt>4</cnt>
</r3>
</r2>
<r2>
<t>parallelogram</t>
<q>1</q>
<cnt>3</cnt>
</r2>
</r1>
<r1>
<t>reflection</t>
<q>2</q>
<cnt>2</cnt>
</r1>
<r1>
<t>refraction</t>
<q>2</q>
<cnt>2</cnt>
</r1>
</vector>

Current stylesheet:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml"/>

<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="q"/>
<xsl:template match="cnt">
<xsl:variable name="cs" select="preceding::cnt"/>
<xsl:variable name="c" select="sum($cs)"/>
<q><xsl:value-of select="preceding-sibling::q"/></q>
<o>
<xsl:choose>
<xsl:when test="$cs = 1 or position() != 1">
<xsl:value-of select="$c + 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$c"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test=". &gt; 1">-<xsl:value-of select="$c + ."/></xsl:if>
</o>
</xsl:template>
</xsl:stylesheet>

Desired output:

<vector>
<r1>
<t>geometry</t>
<r2>
<t>parabola</t>
<r3>
<t>trapezium</t>
<q>1</q>
<o>1-5</o>
</r3>
<r3>
<t>rhombus</t>
<q>1</q>
<o>6-10</o>
</r3>
</r2>
<r2>
<t>parallelogram</t>
<q>1</q>
<o>11-14</o>
</r2>
</r1>
<r1>
<t>reflection</t>
<q>2</q>
<o>1-2</o>
</r1>
<r1>
<t>refraction</t>
<q>2</q>
<o>3-4</o>
</r1>
</vector>

Current Thread