xsl-list
[Top] [All Lists]

RE: Reference to variable cannot be resolved.

2003-02-14 05:09:22

As I understand it, variables are scoped using a 'variable stack' - when a new 
template is matched, a new 'layer' is added to the stack that will contain the 
variables declared in that template.  Should a new template be called/applied 
in the middle of that template, then a new layer is added to the stack.  As 
each template ends, so a layer is popped off the stack.  Therefore only the 
variables at the top of the 'variable stack' are in scope.

Of course, variables that are defined as top-level-elements are handled 
slightly differently, as they are in scope at all times, but will be overridden 
by variables with same name in the current template should a conflict occur.

(this is just from a very limited knowledge of compilers - Im presuming its the 
same in xslt processors)

cheers
andrew

-----Original Message-----
From: Mike Brown [mailto:mike(_at_)skew(_dot_)org]
Sent: 14 February 2003 11:12
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Reference to variable cannot be resolved.


David Carlisle wrote:


Explaining to people why that's legal, after telling them 
they can only
assign x once, is a nice challenge :)

You can only assign a value to a variable once but you can have two
variables with the same name, but only one in scope at any 
point in the
program.

2 buts in one sentence... you're sounding like me now. One 
possible reading of
your explanation would be that when one variable binding 
occurs at the top
level and the other occurs in a template, they are different 
variables with
the same name, whereas if both bindings occur at the top 
level, or if both
occur within a single template, they are binding the same variable.

Perhaps a simpler way to look at it is that the variable 
binding element
(xsl:variable or xsl:param) is just creating/importing an 
object and giving it
a name. The name is then in scope among all following 
siblings and their
descendants. The name can be one that is already in scope 
only if the other
binding that used that name was made at the top level and 
this binding is
being made in a template.

No matter how you explain it, there's nothing really 
intuitive about it; it's
just the way things are; you have to state that the top-level 
bindings are 
global, yet overridable within a template, no?

Mike

-- 
  Mike J. Brown   |  http://skew.org/~mike/resume/
  Denver, CO, USA |  http://skew.org/xml/

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





---
Incoming mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.454 / Virus Database: 253 - Release Date: 10/02/2003
 


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.454 / Virus Database: 253 - Release Date: 10/02/2003
 

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



<Prev in Thread] Current Thread [Next in Thread>