xsl-list
[Top] [All Lists]

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

2006-03-15 06:04:06
This template:

  <xsl:template name="does-image-flickr">
    <xsl:choose><!-- photo is a flickr link -->
      <xsl:when test="/page/images/image[(_at_)name=$name]/flickr">
        <a href="{/page/images/image[(_at_)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(_at_)smolny(_dot_)plus(_dot_)com] 
Sent: 15 March 2006 12:46
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Second of two consecutive call-template 
instructions appears to affect the first?

"Michael Kay" <mike(_at_)saxonica(_dot_)com> 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[(_at_)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[(_at_)name=$name]/flickr">
        <a href="{/page/images/image[(_at_)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[(_at_)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>


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--





--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--