RE: [xsl] Second of two consecutive call-template instructions appears to affect the first?

Subject: RE: [xsl] Second of two consecutive call-template instructions appears to affect the first?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 15 Mar 2006 13:03:36 -0000
This template:

  <xsl:template name="does-image-flickr">
    <xsl:choose><!-- photo is a flickr link -->
      <xsl:when test="/page/images/image[@name=$name]/flickr">
        <a href="{/page/images/image[@name=$name]/flickr}">
          <xsl:call-template name="pass-image-params" />

contains two refences to the variable $name, which isn't in scope in this
template. If you want it to be available in this template, you need to pass
it as a parameter.

It looks as if Xalan isn't reporting this error if it occurs in a template
that isn't called. The XSLT 1.0 spec isn't very precise about which errors
are static errors and which are dynamic, so that's probably conformant: XSLT
2.0 makes it mandatory to report this as a static error.

Michael Kay
http://www.saxonica.com/
 

> -----Original Message-----
> From: Sebastian Tennant [mailto:sebyte@xxxxxxxxxxxxxxx] 
> Sent: 15 March 2006 12:46
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Second of two consecutive call-template 
> instructions appears to affect the first?
> 
> "Michael Kay" <mike@xxxxxxxxxxxx> wrote:
> 
> >> Regarding the problem in hand, I just don't get it.  
> >
> > I suspect no-one else does either, which accounts for the 
> lack of response
> > (the only answers, I think, have been wild guesses). I'd 
> suggest posting the
> > complete stylesheet both with and without the offending 
> lines, and telling
> > you which XSLT processor you are using. At the very least 
> we can then
> > determine whether other processors report the same error.
> >
> > Michael Kay
> > http://www.saxonica.com/
> 
> I'm so pleased it's not just me that thinks this is strange, *phew*,
> and you'll no doubt be pleased to hear Michael, that it isn't Saxon
> which is choking, but Xalan.
> 
> I'm using:
> 
>   Xalan version 1.10.0
>   Xerces version 2.7.0
> 
> I haven't tried Saxon yet, but now I think I just might give it a
> go...
> 
> The whole stylesheet is below, as requested and the offending lines
> are commented out.  My original post explains the required form of the
> XML source and the exact error text I'm getting is:
> 
>   "XSLException Type is: XSLTProcessorException
>                 Message is: The variable 'name' is not defined.
>   
> (file:///home/sebyte/xml/html/justonecornetto.org/xml/xsl-src/
> images.xsl,
>    line 47, column 63)"
> 
> sdt
> 
> P.S. I tried sending it as an attachment but the list server didn't
>      like it, hence here it is, no doubt all horribly wrapped :-(
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
>                 xmlns="http://www.w3.org/1999/xhtml";
>                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 
>   <!-- photos -->
>   <xsl:template match="//photos">
>     <xsl:for-each select="photo">
>       <xsl:apply-templates select=".">
>         <xsl:with-param name="ppos"><xsl:value-of 
> select="../@ppos" /></xsl:with-param>
>         <xsl:with-param name="cpos"><xsl:value-of 
> select="../@cpos" /></xsl:with-param>
>         <xsl:with-param name="stacked">true</xsl:with-param>
>       </xsl:apply-templates>
>     </xsl:for-each>
>   </xsl:template>
> 
>   <!-- photo -->
>   <xsl:template match="//photo">
>     <xsl:param name="name"><xsl:value-of select="@name" /></xsl:param>
>     <xsl:param name="ppos"><xsl:value-of select="@ppos" /></xsl:param>
>     <xsl:param name="cpos"><xsl:value-of select="@cpos" /></xsl:param>
>     <xsl:param name="caption"><xsl:value-of select="@caption" 
> /></xsl:param>
>     <xsl:param name="stacked" />
>     <xsl:variable name="class">
>       <xsl:choose><!-- photos must either be stacked or 
> individual floats -->
>         <xsl:when test="$stacked='true'"><xsl:value-of 
> select="concat('photo stacked-',$ppos)" /></xsl:when>
>         <xsl:otherwise><xsl:value-of select="concat('photo 
> float-',$ppos)" /></xsl:otherwise>
>       </xsl:choose>
>     </xsl:variable>
>     <xsl:choose>
>       <xsl:when test="$cpos!=''"><!-- there's a caption which 
> requires a surrounding div -->
>         <div class="{$class}" 
> style="{concat('width:',/page/images/image[@name=$name]/width,'px')}">
>           <xsl:call-template name="does-image-flickr" />
> <!--           <xsl:call-template name="write-caption"> -->
> <!--             <xsl:with-param name="cpos"><xsl:value-of 
> select="$cpos" /></xsl:with-param> -->
> <!--             <xsl:with-param name="caption"><xsl:value-of 
> select="$caption" /></xsl:with-param> -->
> <!--           </xsl:call-template> -->
>         </div></xsl:when>
>       <xsl:otherwise><!-- or there isn't -->
>         <xsl:call-template name="does-image-flickr" />
>       </xsl:otherwise>
>     </xsl:choose>
>   </xsl:template>
> 
>   <xsl:template name="does-image-flickr">
>     <xsl:choose><!-- photo is a flickr link -->
>       <xsl:when test="/page/images/image[@name=$name]/flickr">
>         <a href="{/page/images/image[@name=$name]/flickr}">
>           <xsl:call-template name="pass-image-params" />
>       </a></xsl:when>
>       <xsl:otherwise><!-- or it isn't-->
>       <xsl:call-template name="pass-image-params" /></xsl:otherwise>
>     </xsl:choose>
>   </xsl:template>
> 
>   <xsl:template name="pass-image-params">
>     <xsl:apply-templates select="/page/images/image[@name=$name]">
>       <xsl:with-param name="cpos"><xsl:value-of 
> select="$cpos" /></xsl:with-param>
>       <xsl:with-param name="caption"><xsl:value-of 
> select="$caption" /></xsl:with-param>
>       <xsl:with-param name="class"><xsl:value-of 
> select="$class" /></xsl:with-param>
>     </xsl:apply-templates>
>   </xsl:template>
> 
>   <!-- images -->
>   <xsl:template match="//image">
>     <xsl:param name="cpos" />
>     <xsl:param name="caption" />
>     <xsl:param name="class" />
> 
>     <xsl:element name="img">
>       <xsl:attribute name="alt"><xsl:choose><!-- alt 
> attribute defaults to desc -->
>         <xsl:when test="$caption!=''"><xsl:value-of 
> select="$caption" /></xsl:when>
>         <xsl:otherwise><xsl:value-of select="desc" /></xsl:otherwise>
>       </xsl:choose></xsl:attribute>
>       <!-- src attribute -->
>       <xsl:attribute name="src"><xsl:value-of select="file" 
> /></xsl:attribute>
>       <!-- class attribute required if no caption and hence 
> no containing div -->
>       <xsl:if test="$cpos=''">
>         <xsl:attribute name="class"><xsl:value-of 
> select="$class" /></xsl:attribute>
>       </xsl:if>
>     </xsl:element>
>   </xsl:template>
> 
>   <xsl:template name="write-caption">
>     <xsl:param name="cpos" />
>     <xsl:param name="caption" />
>     <xsl:if test="$cpos='below'"><br /></xsl:if>
>     <xsl:if test="$cpos!=''"><!-- caption position specified -->
>       <xsl:choose><!-- but no caption specified, use desc as 
> default -->
>         <xsl:when test="$caption!=''"><xsl:value-of 
> select="$caption" /></xsl:when>
>         <xsl:otherwise><xsl:value-of select="desc" /></xsl:otherwise>
>       </xsl:choose>
>     </xsl:if>
>   </xsl:template>
> 
> </xsl:stylesheet>

Current Thread