xsl-list
[Top] [All Lists]

RE: Using the count function to count the previous siblings in XLST 1.0

2005-05-03 04:05:10
This has come up twice already in the last week. The preceding sibling of an
element is the element that appears before it in the source tree. Sorting
elements does not change their position in the source tree and therefore
does not change their siblings.

To get the position of an element in the sorted sequence, use the position()
function.

Michael Kay
http://www.saxonica.com/

-----Original Message-----
From: Marco Mastrocinque [mailto:mmfive(_at_)netspace(_dot_)net(_dot_)au] 
Sent: 03 May 2005 11:39
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Using the count function to count the previous 
siblings in XLST 1.0

Hi All,
       After further investigation I have I can use the following;

<xsl:when test = "position() = last()">
<xsl:value-of select="count(preceding-sibling::employee) + 1"/>

But there is another problem, I wish to sort by two elements 
'OFFICE' and
'ENAME'. If I comment out the two xsl:sort lines, the count is correct
(shown below). But if uncomment them, the count is incorrect. 
Why is is this
happening?

Thanks Marco Mastrocinque     

<xsl:for-each select="company/division">
  <xsl:for-each select="employees/employee">          
      <!--<xsl:sort select="OFFICE"/>--> **Problem**
      <!--<xsl:sort select="ENAME"/>-->  **Problem** 

      

      

-----Original Message-----
From: Marco Mastrocinque [mailto:mmfive(_at_)netspace(_dot_)net(_dot_)au] 
Sent: Tuesday, 3 May 2005 7:57 PM
To: (xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com)
Subject: Using the count function to count the previous 
siblings in XLST 1.0

Hi All,
       I have the following snippet of code. 

  <xsl:for-each select="company/division">
    <xsl:for-each select="employees/employee">                
      <xsl:sort select="OFFICE"/>
      <xsl:sort select="ENAME"/>
        <tr>                          
          <td>
              <xsl:choose>
                 <xsl:when test="position() != last()">
                      <xsl:value-of select="concat(' ', @EID, 
', ', ENAME,
', ',OFFICE)"/>
                 </xsl:when>
                 <xsl:when test = "position() = last()">      
                      <xsl:value-of select="concat(' ', @EID, 
', ', ENAME,
', ',OFFICE)"/>
<xsl:text>&#xa;&#xa;&#xa;&#xa;Count is</xsl:text>
                      <xsl:value-of 
select="count(employees/employee)"/>
</xsl:when>

          </td>
</tr>
</xsl:for-each>          
</xsl:for-each>

This works by displaying a whole series of data in a single 
column in a HTML
table. At the end of each employees/employee, with the last 
value in this
previously mentioned element output, I wan't to display the count of 
'count(employees/employee)'. It displays zero, because the system has
already cycled all the way trough them. I want to all the 
previous-siblings
plus the last one. Can it be done? I want the output to be,

Element 1 (First group)

Element 2

Element 3
Element 4 Count is 4

Element 1 (Second group)
Element 2
Element 3
Element 4
Element 5 Count is 5
Etc...

All this a SINGLE column of a HTML table.

Thanks Marco Mastrocinque

                                                                      
                                              


--~------------------------------------------------------------------
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>