Re: [xsl] Count() elements in range

Subject: Re: [xsl] Count() elements in range
From: Chris.Pearson@xxxxxxxxxxxx
Date: Thu, 16 Oct 2003 13:00:28 -0400
Figured it out...maybe it can help someone else!

<xsl:template match="/root/element">
  <xsl:choose>
    <xsl:when test="(following-sibling::element[1][child::flag]) or
(count(following-sibling::element) = 0)"> <!-- only call when it's the last
element in a series-->
      <xsl:call-template name="countFlags">
        <xsl:with-param name="nodeList" select="preceding-sibling::element"
/>
        <xsl:with-param name="followingFlags" select
="count(following-sibling::element[flag])"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise />
  </xsl:choose>
</xsl:template>

<xsl:template name="countFlags">
  <xsl:param name="nodeList"/>
  <xsl:param name="followingFlags"/>
  <xsl:value-of select="1 + count
($nodeList[count(following-sibling::element[flag]) = $followingFlags])"/>
</xsl:template>

gives output:
Element A1: 1
Element B4: 4
Element C2: 2
Element D3: 3

<root>
<element number="A1"><!--start a series of 1 -->
<flag/>
</element><!-- only 1 in series, so count is only 1 -->
<element number="B1"><!-- start a series of 4 -->
<flag/>
</element>
<element number="B2"/>
<element number="B3"/>
<element number="B4"/><!-- count the previous 3 elements -->
<element  number="C1"><!-- start a series of 2 -->
<flag/>
</element>
<element  number="C2"/><!--count the previous 1 element -->
<element  number="D1"><!-- start a series of 3 -->
<flag/>
</element>
<element  number="D2" />
<element  number="D3" /><!-- count the previous 2 elements -->
</root>


Chris Pearson
Agilisys Automotive
248.697.3443
Chris.Pearson@xxxxxxxxxxxx




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread