RE: [xsl] variable binding

Subject: RE: [xsl] variable binding
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Thu, 6 Nov 2003 15:08:18 -0000
> 
> 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


Current Thread