John is right about not being able to change variables and I think that in order to achieve the effect you want, you should consider using some Java code inside your XSL.  I had a similar problem when trying to track indenting levels affected by different template matches.  Of course outside of each template match that defines the variable, it does not exist so is actually pretty useless!
One approach
1) Create a Java class like so
package com.myplace.utils.XSLVariable;
public class XSLVariable
    public static void setVar( long NewVal )
        ms_lVariable    = NewVal;
    public static long getVar()   { return ms_lVariable; }
    private static long ms_lVariable    = 0;
2) Compile the class and JAR up.
3) Add the JAR file to the classpath for your FOP/XSL processor.
4) Create a namespace in the XSL file as follows:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:utils="com.myplace.utils.XSLVariable" version="1.0">
5) Then use a dummy variable to call get and set methods to modify your variable.
  <xsl:variable name="temp" select="utils:XSLVariable.setVar(utils:XSLVariable.getVar() + 5)"/>
  or value-of to output

  <xsl:value-of select="utils:XSLVariable.getVar()"/>
Hope this is useful. There is more information on how to do this in the Apache Xalan help, but I can't remember exactly where just now.

-----Original Message-----
From: John Gentilin [mailto:[EMAIL PROTECTED]
Sent: 06 November 2002 00:19
Subject: Re: incrementing variable

You need to read the XSL Spec or M Kay's XSLT book about
side effect free programming. Variables in XSL can only be assigned
once and never modified.

John G

xavier gibouin wrote:

hi this is my xsl code : <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/Graphics/SVG/SVG-19990812.dtd">
<xsl:variable name="x" select="10"/>
 <xsl:template name="codebarre">
  <xsl:variable name="index" select="string-length(codebarre)"/>

  <xsl:param name="i" select="0"/>   <xsl:if test="$i &lt; $index">
    <xsl:when test="substring(codebarre,$i+1,1)='1'">
     <fo:block><xsl:value-of select="$x"/></fo:block>
     <xsl:variable name="x" select="$x + 4"/>
    <xsl:when test="substring(codebarre,$i+1,1)='2'">
     <fo:block><xsl:value-of select="$x"/></fo:block>
     <xsl:variable name="x" select="$x + 1.5"/>
    <xsl:when test="substring(codebarre,$i+1,1)='3'">
     <fo:block><xsl:value-of select="$x"/></fo:block>
     <xsl:variable name="x" select="$x + 3"/>
    <xsl:when test="substring(codebarre,$i+1,1)='4'">
     <fo:block><xsl:value-of select="$x"/></fo:block>
     <xsl:variable name="x" select="$x + 1.5"/>
   </xsl:choose>    <xsl:call-template name="codebarre">
    <xsl:with-param name="i" select="$i+1"/>
   </xsl:call-template>   </xsl:if>
</xsl:stylesheet> this code always writes1010101010... $x is not incremented any ideas? thanks a lot Xavier Gibouin
Espace Mercoeur
8, rue Mercoeur
44000 Nantes

----- Original Message -----
Sent: Tuesday, November 05, 2002 5:52 PM
Subject: Re: variable and svg

put braces around the variable when it is outside an xsl tag:

      <rect height="50" width="4.0" x="{$x}" y="0.0"/>


Reply via email to