xsl-list
[Top] [All Lists]

Re: Position() vs counter variable

2005-04-04 12:18:21
On Mon, Apr 04, 2005 at 03:07:53PM -0400, Maria Amuchastegui wrote:
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?

position() isn't really 'relative to the parent node'.
It's relative to the list of nodes selected by a particular
select="" attribute.

Here you have a for-each selecting the Section elements
of a particular type.  The position() will tell you what
the order is among those selected Section elements.

What you are probably looking for is something like
count(preceding-sibling::Section) instead of position() to get 
the number of Section elements occuring prior to the current
node.. 


 
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[(_at_)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>

 

 


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>