xsl-list
[Top] [All Lists]

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

2004-11-30 14:27:45
Looking back at the thread, it seems that no-one has given you the most
basic information - probably because we see it said so often on this list
that we forget there are people who haven't heard it: YOU CANNOT UPDATE
VARIABLES IN XSLT.

Everyone who has responded to you has hinted at this, by showing you
solutions that don't involve updating variables, but I don't think anyone
said it directly.

In your match="Lists" template you have a variable called $index whose value
is 0. This template calls the named template with name="formatTitle",
specifying

<xsl:with-param name="$index" select="$index+1"/>

The $index in the name attribute refers to a local parameter in the
formatTitle template, while the $index in the select attribute refers to the
variable in the calling match="Lists" template. They are unrelated
variables, so let's change their names to make it clearer:

<xsl:with-param name="$index-B" select="$index-A + 1"/>

$index-A is always 0. Therefore $index-B is always 1.

I hope this explains to you why your code isn't working. It doesn't solve
your problem - but as regulars on this list will know, I often try to help
people understand their problems but I very rarely write substantial chunks
of code for them.

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


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

Hi all:
  I got so many peopel help but I can't get solution
for my problem yet. I need fix it asap so please help
me ! question is : How I can find relatiove position 
on the node which satify the condition ? I try to set
the variable called index and increment index value
when I call template but the index value is always 1

I work on this problems for several days, I wish I can
get help for solution.

Thanks



xml file:
<Lists>
<List >
  <List_ID>10</List_ID>
   <Title>A</Title>
  <Parent_ID>1</Parent_ID>
 </List>
 <List>
   <List_ID>11</List_ID>
   <Title>A1</Title>
   <Parent_ID>10</Parent_ID>
 </List>
<List >
    <List_ID>12</List_ID>
   <Title>B</Title>
  <Parent_ID>20</Parent_ID>
 </List>
 <List >
   <List_ID>13</List_ID>
   <Title>A2</Title>
   <Parent_ID>10</Parent_ID>
 </List>
 <List >
   <List_ID>14</List_ID>
   <Title>C</Title>
    <Parent_ID>1</Parent_ID>
 </List>
  </Lists>


xsl:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; >

<xsl:template match="Lists"  >
        <xsl:apply-templates>
<xsl:with-param name="ValidCount"
select="number(count(List)-count(List[Parent_ID=../List/List_ID]))"/>
 
</xsl:apply-templates>           
</xsl:template>               

<xsl:template match="List">
   <xsl:param name="ValidCount"/>
   <xsl:variable name="self" select="."/> 
   <xsl:variable name="index" select="0"/> 
   <xsl:choose>
   <xsl:when test="Parent_ID=1 or
not(preceding-sibling::List[List_ID = $self/Parent_ID]
 or following-sibling::List[List_ID =
$self/Parent_ID])"> 
 <xsl:call-template name="formatTitle">
  <xsl:with-param name="index" select="$index+1"/>
  <xsl:with-param name="TotalCount"
select="$ValidCount"/> 
<xsl:with-param name="Title" select="Title"/>         
            
</xsl:call-template>
<xsl:call-template name="findChildNode">
  <xsl:with-param name="ParentID" select="List_ID"/>
</xsl:call-template> 
</xsl:when> 
</xsl:choose>                   
</xsl:template> 

<xsl:template name="findChildNode">
....this part work
</xsl:template>

<xsl:template name="formatTitle">
         <xsl:param  name="index" />
                  <xsl:param  name="TotalCount"/> 
               index:  <xsl:value-of select="$index"/>
                  <xsl:param name="Title"/>   
                  <xsl:choose>
<xsl:when test="$TotalCount=1 or $index=1">
 <b><xsl:value-of select="$Title"/></b>                       
                      
                                              </xsl:when>
                                              <xsl:when 
test="$index = $TotalCount -1">
                                                   <b> and 
<xsl:value-of select="$Title"/></b>
                                      
                                              </xsl:when>
                                              <xsl:when 
test="$index  = $TotalCount">
                                                   <b> 
<xsl:value-of select="$Title"/></b>                           
      
                                              </xsl:when>
                                              <xsl:otherwise>
                                                 <b>; 
<xsl:value-of select="$Title"/></b>   
                                              </xsl:otherwise> 
                                </xsl:choose> 
      </xsl:template>
</xsl:stylesheet>


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