[xsl] Position() vs counter variable

Subject: [xsl] Position() vs counter variable
From: Maria Amuchastegui <mamuchastegui@xxxxxxxxxxx>
Date: Mon, 4 Apr 2005 15:07:53 -0400
My data contains a series of tables that I need to number consecutively,
i.e. 1, 2, 3. I want to do this using the position() property. However,
because the position is relative to the parent node, the numbering is
restarting whenever there is a new parent node, so I get: 1, 2, 1. Is there
a way to do this using position(), or do I have to set up a counter
variable?
 
Here is the XSL:
 
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform
<http://www.w3.org/1999/XSL/Transform> "
xmlns:fo="http://www.w3.org/1999/XSL/Format
<http://www.w3.org/1999/XSL/Format> ">
 <xsl:output method="html"/>
 <xsl:template match="/">
  <html>
   <body>
    <xsl:apply-templates select="myXMLData"/>
   </body>
  </html>
 </xsl:template>
 <xsl:template match="myXMLData">
  <xsl:apply-templates select="//BTN"/>
 </xsl:template>
 <xsl:template match="//BTN">
  <b><xsl:value-of select="@number"/></b>
  <xsl:for-each select="Section[@type='Detail']">
   <table border="1">
    <th colspan="6" align="left">
     This is table <xsl:value-of select="position()"/>. 
    </th>
    <tr>
     <th>ID </th>
     <th>Date </th>
     <th>Location </th>
     <th>Number </th>
     <th>Duration</th>
     <th>Charges </th>
    </tr>
    <xsl:apply-templates select="ServiceHeader"/>
   </table>
   <br/>
  </xsl:for-each>
 </xsl:template>
 <xsl:template match="ServiceHeader">
  <xsl:if test="@group != '' ">
   <tr>
    <td colspan="6"><xsl:value-of select="@group"/></td>
   </tr>
  </xsl:if>
  <xsl:apply-templates select="message"/>
 </xsl:template>
 <xsl:template match="message">
  <tr>
   <td><xsl:value-of select="id"/></td>
   <td><xsl:value-of select="date"/></td>
   <td><xsl:value-of select="location"/></td>
   <td><xsl:value-of select="number"/></td>
   <td><xsl:value-of select="duration"/></td>
   <td><xsl:value-of select="charges"/></td>
  </tr>
 </xsl:template>
</xsl:stylesheet>

 
And here is the XML:
 
<?xml version="1.0" encoding="UTF-8"?>
<myXMLData xmlns="">
 <BTN number="635 5669">
  <Section number="400" type="Detail" subHead1="Long distance calls"
subHead2="">
   <ServiceHeader group="">
    <message>
     <id>1-01</id>
     <date>2005-04-23</date>
     <location>Quebec QC</location>
     <number>418 683 1234</number>
     <duration>1</duration>
     <charges>0.43</charges>
     <savings>.043</savings>
     <amount/>
    </message>
    <message>
     <id>1-02</id>
     <date>2005-04-28</date>
     <location>Montreal QC</location>
     <number>514 485 6611</number>
     <duration>2</duration>
     <charges>3.44</charges>
     <savings/>
     <amount/>
    </message>
   </ServiceHeader>
  </Section>
  <Section number="420" type="Summary"/>
  <Section number="430c" type="Detail" subHead1="Advantage Per Call"
subHead2="">
   <ServiceHeader group="Canada">
    <message>
     <id>1-06</id>
     <date>2005-05-06</date>
     <location>Collingwood ON</location>
     <number>705 445 1030</number>
     <duration>1.4</duration>
     <charges>5.01</charges>
     <savings/>
     <amount/>
    </message>
    <message>
     <id>1-07</id>
     <date>2005-04-12</date>
     <location>Erin ON</location>
     <number>519 833 2380</number>
     <duration>1.1</duration>
     <charges>0.78</charges>
     <savings/>
     <amount/>
    </message>
   </ServiceHeader>
  </Section>
  <Section number="450c" type="Summary" subHead1="" subHead2=""/>
 </BTN>
 <BTN number="635 5670">
  <Section number="400" type="Detail" subHead1="Long distance calls"
subHead2="">
   <ServiceHeader group="">
    <message>
     <id>1-12</id>
     <date>2005-04-08</date>
     <location>Edmonton AB</location>
     <number>780 496 8200</number>
     <duration>3</duration>
     <charges>0.25</charges>
     <savings/>
     <amount/>
    </message>
    <message>
     <id>1-13</id>
     <date>2005-04-15</date>
     <location>Halifax NS</location>
     <number>902 490 6277</number>
     <duration>5</duration>
     <charges>1.01</charges>
     <savings/>
     <amount/>
    </message>
   </ServiceHeader>
  </Section>
  <Section number="420" type="Summary"/>
 </BTN>
</myXMLData>

Current Thread