xsl-list
[Top] [All Lists]

RE: variable binding

2003-11-06 08:08:18

So then what does it mean to say that "variable bindings declared in 
templates should be visible to descendants and following siblings"? 
This is what it says in the specs.

Actually, it says "for all following-siblings and their descendants".
This means nodes in the stylesheet tree that are following-siblings, or
descendants of following-siblings, of the xsl:variable element in the
stylesheet tree.

Michael Kay


Also, the whole reason I wanted to do this was because I am 
trying to find 
the leftmost daughter of the element ng.
Is there a way to do this?  I have really thought about it a 
lot but can't 
seem to find anything workable.
-Shipra



On Wed, 5 Nov 2003, Michael Kay wrote:


I'm having trouble with variable binding - basically, I read
that variable 
bindings declared in templates should be visible to 
descendants and 
following siblings, but I'm getting not getting the behavior 
I thought I 
would with my stylesheet using Saxon 6.5.2...

You've misunderstood the rules. The scope of variables is 
static, not 
dynamic. It doesn't depend on your source document, and it doesn't 
depend on the way in which templates call each other. 
You're trying to 
reference a variable in one template that's declared in a different 
template. What you need to do is pass the value as a parameter from 
one template to the other, using xsl:with-param and xsl:param.

Michael Kay



so the relevant part of my file looks like this (it's a
subbranch of s):
          <ng of='proteins' role='h'>
                <nx head='targeting' role='h'>
                     <W index='92'>the</W>
                     <W role='h' index='93'>targeting</W>
                </nx>
                     <W index='94'>of</W>
                <nx head='proteins' role='k'>
                     <W index='95'>the</W>
                     <W index='96'>myosin</W>
                     <W role='h' index='97'>proteins</W>
                </nx>
  </ng>

and my stylesheet looks like this:

<xsl:template match="@* | * | comment() | 
processing-instruction() |
node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="s//ng//*[1]" priority="5">
  <xsl:variable name="branch">right</xsl:variable>
  <xsl:copy>
  <xsl:attribute name="branch"><xsl:value-of
select="$branch"/></xsl:attribute>
  <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>


<xsl:template match="s//ng//*" priority="4">
  <xsl:copy>
  <xsl:attribute name="branch"><xsl:value-of
select="$branch"/></xsl:attribute>
  <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

but when I try to run it, it tells me that the variable
branch has not 
been declared, even though it should first have processed 
the first 
daughter of ng, where it has been declared. 

Best,
shipra


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



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




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



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



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