xsl-list
[Top] [All Lists]

RE: Problem for : increment a variable in a for-each?

2004-11-29 01:49:25
I don't fully understand your problem, and the code layout has become
unreadable. But I would think you can solve the problem using the functions
position() and last().

position() gives the position of a node in the sequence of nodes currently
selected by xsl:for-each or xsl:apply-templates, or being filtered by a
predicate. last() gives the number of nodes in such a sequence.
position()=last() is true if the current node is the last one.
position()=last()-1 is true if it is the last but one.

Sometimes you need to know the absolute position of a node in the source
tree, regaredless of the processing order. In such cases you can use
constructs such as xsl:number or count(preceding-sibling::*).

Michael Kay
http://www.saxonica.com 

-----Original Message-----
From: que Li [mailto:queincanada(_at_)yahoo(_dot_)ca] 
Sent: 29 November 2004 04:33
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Problem for : increment a variable in a for-each? 

Hi Michael:
   Thans for help. In actually I found It is good for
me to use the xpath to find the logical chilld node to
format them. 


But I have last probelm:
How can I get the current node position on the special
list?

Example:
<Subject_List>
    <Subject_ID>
    <Subject_Title>
    <Subject_Parent_ID>
</Subject_List>
There have three type of node


Type A; (Logical parent node)
  Subject_Parent_ID =1

Type B: (Logical child node and its logical parent
node exist)

Type C: (Logical child node and its logical parent
node do not exist)
Subject_Parent_ID not eauql 1 but the logical parent
node  exist 

my question:
If the current node is belong to type A or type B. How
I know It is position for typeA and typeB list.


my XSL file:
<xsl:template match="SubjectLists">
           <xsl:apply-templates />
         </xsl:template>              
       <xsl:template match="Subject_List" >
       <xsl:choose>
                      <xsl:when test="Subject_Parent_ID=1">
                                                  <xsl:choose>
                                                              
                      <xsl:when
test="not(preceding-sibling::Subject_List)">
                                                      
<b><xsl:value-of select="Subject_Title"/></b>
                                                              
                      </xsl:when>
                                                              
                      <xsl:when
test="not(following-sibling::Subject_List)">
                                                              
                             <b> ;<xsl:value-of
select="Subject_Title"/></b>
                                                              
                      </xsl:when>
                                                              
                      <xsl:otherwise>
                                                              
                                 <b> and  <xsl:value-of
select="Subject_Title"/></b>
                                                              
                      </xsl:otherwise>
                                 </xsl:choose>  
                                   <xsl:call-template
name="findChildNode">
                                                              
                 <xsl:with-param name="ParentID"
select="Subject_ID"/>
                                  </xsl:call-template>

                     </xsl:when> 
                     <xsl:otherwise>
                          <xsl:call-template
name="findParentNode">
                                  <xsl:with-param
name="ID" select="Subject_Parent_ID"/>
                          </xsl:call-template> 
                    </xsl:otherwise>  
            </xsl:choose>                   
      </xsl:template> 
      <xsl:template name="findChildNode">
             <xsl:param name="ParentID"/>
                 <xsl:for-each
select="../Subject_List[Subject_Parent_ID=$ParentID]">
                     <xsl:choose>
                              <xsl:when
test="position()=1 and last() &gt;2 ">
                                                              
 <b> ( <xsl:value-of
select="Subject_Title"/></b>
                                        </xsl:when>
                                            <!--only one-->
                                                       
<xsl:when test="position()=1 and last()=1">
                                                              
 <b> ( <xsl:value-of
select="Subject_Title"/> )</b>
                                        </xsl:when>
                                        <!--only two-->
                                        <xsl:when 
test="position()=1 and 
last()=2 ">
                                                              
 <b> ( <xsl:value-of
select="Subject_Title"/> </b>
                                        </xsl:when>
                                        <xsl:when 
test="position()!=1 and
position()=last()">
                                           <b> and
<xsl:value-of select="Subject_Title"/> )</b>          
    
                                        </xsl:when>
                                         <xsl:otherwise>
                                               <b> ; <xsl:value-of
select="Subject_Title"/></b>           
                                        </xsl:otherwise> 
                                      </xsl:choose>          
              </xsl:for-each>
      </xsl:template>
      <xsl:template name="findParentNode" >
             <xsl:param name="ID"/>
                       <xsl:if 
test="count(../Subject_List[Subject_ID=$ID]) = 0">
                            <xsl:choose>
                                                              
<xsl:when
test="not(preceding-sibling::Subject_List)">
                                                      
<b><xsl:value-of select="Subject_Title"/></b>
                                                              
</xsl:when>
                                                              
<xsl:when
test="not(following-sibling::Subject_List)">
                                                              
                             <b> ;<xsl:value-of
select="Subject_Title"/></b>
                                                              
</xsl:when>
                                                              
<xsl:otherwise>
                                                              
                                 <b> and  <xsl:value-of
select="Subject_Title"/></b>
                                                      </xsl:otherwise>
                                   </xsl:choose>                      
                            </xsl:if>    
       </xsl:template>   
XML file:
 <root>
<SubjectLists>
   <Subject_List>
              <Subject_ID>31</Subject_ID> 
              <Subject_Title>Biology</Subject_Title> 
              <Subject_Parent_ID>30</Subject_Parent_ID> 
</Subject_List>
  <Subject_List>
              <Subject_ID>32</Subject_ID> 
<Subject_Title>Chemistry</Subject_Title> 
<Subject_Parent_ID>30</Subject_Parent_ID> 
 </Subject_List>
   <Subject_List>
              <Subject_ID>24</Subject_ID> 
<Subject_Title>Legal Studies</Subject_Title> 
<Subject_Parent_ID>1</Subject_Parent_ID> 
  </Subject_List>
 <Subject_List>
              <Subject_ID>17</Subject_ID> 
<Subject_Title>Music</Subject_Title> 
<Subject_Parent_ID>14</Subject_Parent_ID> 
  </Subject_List>
     <Subject_List>
              <Subject_ID>30</Subject_ID> 
              <Subject_Title>Science</Subject_Title> 
              <Subject_Parent_ID>1</Subject_Parent_ID> 
  </Subject_List>
    <Subject_List>
  <Subject_ID>18</Subject_ID> 
  <Subject_Title>Visual Arts</Subject_Title> 
                <Subject_Parent_ID>14</Subject_Parent_ID> 
 </Subject_List>
  </SubjectLists>
</root>



Now the result is:

and Legal Studies and Music and Science ( Biology and
Chemistry ) ;Visual Arts 


the correct result should be:

Legal Studies ; Music ; Science ( Biology and
Chemistry ) and Visual Arts 


Thanks
Helena
 

______________________________________________________________
________ 
Post your free ad now! http://personals.yahoo.ca

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