xsl-list
[Top] [All Lists]

RE: Problems incrementing a variable in a <xsl:for-each>

2002-10-23 07:32:03
Morning,
 
XSLT is somewhat difficult to adopt given that many programming idioms don't 
apply. You've run into this problem with attempting to increment a variable in 
the way you might in C# or Java. The trick in XSLT is to do things a little 
differently.
 
You cannot do what you are doing for two reasons:
- variables only exist within the scope that they are declared
- variables (and params) are immutable
 
First, you have to ask yourself the question of why you are incrementing a 
variable. It looks like you want to determine the number of clients in your 
file. You can do that via the count function.
 
Try modifying your transform in the following way:
 
<xsl:stylesheet version='1.0'
  xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
<http://www.w3.org/1999/XSL/Transform'> >
<xsl:output method='text'/>

<xsl:variable name="counter" select="0"/>
<xsl:template match='CLIENTS'> 
    <xsl:value-of select="count(CLIENT)"/>
</xsl:template>
</xsl:stylesheet>

Thanks,

Rich


        -----Original Message----- 
        From: Carlos Barroso [mailto:est-c-barroso(_at_)ptinovacao(_dot_)pt] 
        Sent: Wed 23/10/2002 6:42 AM 
        To: XSL-List-Digest(_at_)lists(_dot_)mulberrytech(_dot_)com 
        Cc: 
        Subject: [xsl] Problems incrementing a variable in a <xsl:for-each>
        
        

        Hy there.
        I'm having problems incrementing a variable in a <xsl:for-each> section.
        Below is the XML document, the stylesheet I used and the output I got.
        
        -----------------------
        XML file
        -----------------------
        
        <?xml version='1.0' encoding='ISO-8859-1'?>
        <!DOCTYPE CLIENTS SYSTEM 'counter.dtd'>
        
        <CLIENTS>
          <CLIENT>
            <NAME value='xpto'/>
            <AGE value='10'/>
          </CLIENT>
          <CLIENT>
            <NAME valor='xxx'/>
            <AGE valor='20'/>
          </CLIENT>
        </CLIENTS>
        
        ----------------------
        First XSL file
        ----------------------
        
        <?xml version='1.0' encoding='ISO-8859-1'?>
        
        <xsl:stylesheet version='1.0'
          xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
        <xsl:output method='text'/>
        
        <xsl:variable name="counter" select="0"/>
        <xsl:template match='/CLIENTS'> 
          <xsl:for-each select="./CLIENT">
            <xsl:variable name="counter" select="1 + $counter"/>
            <xsl:value-of select="$counter"/>
          </xsl:for-each>
        </xsl:template>
        </xsl:stylesheet>
        
        -------------------------
        Output in TXT file
        -------------------------
        
        11
        
        -------------- // --------------
        
        ------------------------
        Second XSL test
        ------------------------
        
        <?xml version='1.0' encoding='ISO-8859-1'?>
        
        <xsl:stylesheet version='1.0'
          xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
        <xsl:output method='text'/>
        
        <xsl:variable name="counter" select="0"/>
        <xsl:template match='/CLIENTS'> 
            <xsl:variable name="counter" select="1 + $counter"/>
            <xsl:value-of select="$counter"/>
            <xsl:variable name="counter" select="1 + $counter"/>
            <xsl:value-of select="$counter"/>
        </xsl:template>
        </xsl:stylesheet>
        
        -------------------------
        Output in TXT file
        -------------------------
        
        12
        
        -------------- // --------------
        
        In the second XSL file, the counter procedes as planned. But in the 
first
        XSL the counter mantains
        it's value!? I tried using templates instead of "<xsl:for-each>" but it
        gives me the same results!
        I don't know what's wrong.
        Can someone help me please. This is very weird to me.
        Thanks a lot.
        
        
         XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
        
        


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list