RE: [xsl] Passing empty parameters discard parameters default value

Subject: RE: [xsl] Passing empty parameters discard parameters default value
From: ĎURDINA Michal <Michal.Durdina@xxxxxxxxxxxx>
Date: Fri, 18 Jun 2004 19:20:17 +0200
Probably only workaround is to define default parameter for template like this:

  <xsl:template name="mytemplate_impl">
    <xsl:param name="p">default p</xsl:param>
    <xsl:variable name="p2">
      <xsl:choose>
        <xsl:when test="$p = ''">default p</xsl:when>
        <xsl:otherwise><xsl:copy-of select="$p"/></xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    p = <xsl:value-of select="$p2"/>
  </xsl:template>

  <xsl:template name="mytemplate">
    <xsl:param name="p"/>
    <xsl:call-template name="mytemplate_impl">
      <xsl:with-param name="p" select="$p"/>
    </xsl:call-template>
  </xsl:template>

Then calling
        <xsl:call-template name="mytemplate"/>
gives required result:
	p = default p
providing one is not allowed to use empty string as a valid parameter value.

Or does anyone have better idea?

Anyway, I find this as a lack of XSLT Specification that could specify extra meaning to 
<xsl:param name="p"/>. In this case $p should have special value 'nothing' and sending this variable as a value to parameter in another template would be equal to as not sending that parameter. 

I don't know if there is something prepared in XSLT2.0 that could solve this in more elegant way. If there is I would be happy to know of such a feature.

Thank you,
Michal

> -----Original Message-----
> From: Michael Kay [mailto:mhk@xxxxxxxxx]
> Sent: Thursday, June 17, 2004 12:59 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] Passing empty parameters discard parameters default
> value
> 
> 
> > 
> > I am having problems with passing empty parameters (no 
> > with-param specified) that discard default values of 
> > parameters. When I am calling the template and passing no 
> > value I want the template to use its default value.
> > 
> > Example:
> > 
> >   <xsl:template name="mytemplate">
> >     <xsl:param name="p"/>
> 
> This is exactly the same as specifying
> 
> <xsl:param name="p" select="''"/>
> 
> that is: $p is given a value which is the zero-length string. 
> You are then
> supplying this value to the other template. The only way to 
> get the second
> template to use its default value for the parameter is to omit the
> xsl:with-param from the call.
> 
> Michael Kay
> 
> 
> >     <xsl:call-template name="mytemplate_impl">
> >       <xsl:with-param name="p" select="$p"/>
> >     </xsl:call-template>
> >   </xsl:template>
> >   
> >   <xsl:template name="mytemplate_impl">
> >     <xsl:param name="p">default p</xsl:param>
> >     p = <xsl:value-of select="$p"/>
> >   </xsl:template>
> > 
> > When calling:
> >     <xsl:call-template name="mytemplate_impl"/>
> > the result is:
> > 	p = default p
> > But when calling 
> >     <xsl:call-template name="mytemplate"/>
> > the result is:
> > 	p =
> > 
> > what is wrong in my case, becase I did not supplied any value 
> > to parameter $p so I want to see its default value. I know 
> > that I can declare the same default value in template 
> > "mytemplate" , but then I will have the same value in more 
> > than one place and that's not good when I will need to change it.
> > 
> > Is there any workaround for my problem?
> > 
> > Thank you, 
> > Michal
> > 
> > PS: If you want to have full pricture why I need this default 
> > parameter mechanism, here it is:
> > 
> > I have hierarchy of importing stylesheets and I try to 
> > simulate polymorphism for named templates via shadowing of 
> > "interface" templates and by calling "implementation" templates.
> > 
> > library.xsl:
> >   <!-- interface template -->
> >   <xsl:template name="mytemplate">
> >     <xsl:param name="p"/>
> >     <xsl:call-template name="mytemplate_impl">
> >       <xsl:with-param name="p" select="$p"/>
> >     </xsl:call-template>
> >   </xsl:template>
> > 
> >   <!-- implementation template -->
> >   <xsl:template name="mytemplate_impl">
> >     <xsl:param name="p">default p</xsl:param>
> >     p = <xsl:value-of select="$p"/>
> >   </xsl:template>
> > 
> > customized-library.xsl:
> >   <xsl:import href="library.xsl"/>
> > 
> >   <!-- interface template -->
> >   <xsl:template name="mytemplate">
> >     <xsl:param name="p"/>
> >     <b>
> >       <xsl:call-template name="mytemplate_impl">
> >         <xsl:with-param name="p" select="$p"/>
> >       </xsl:call-template>
> >     </b>
> >   </xsl:template>
> > 
> > user-stylesheet.xsl:
> > 
> >   <xsl:include href="customized-library.xsl"/>
> >   ...
> >   <xsl:template match="/">
> >     <xsl:call-template name="mytemplate"/>
> >   </xsl:template>
> > 
> > user-input.xml:
> > <?xml-stylesheet type="text/xsl" href="user-stylesheet.xsl"?>
> > <root/>
> > 
> > required output:
> >   <b>p = default p</b>
> > 
> > actual output:
> >   <b>p = </b>
> > 
> > I hope the idea is ok, developer of user-stylesheet.xsl can 
> > customize templates from library.xsl that he/she uses in 
> > user-stylesheet.xsl. But I am having the problem with passing 
> > empty parameter (no parameter) that discard default value in 
> > original template.
> > 
> > -----------
> > Michal Ďurdina
> > ASSET Soft, a.s. / eBussiness Solutions
> > Košická 56, 821 08 Bratislava SLOVAK REPUBLIC
> > Phone: +421-2-50703-523
> > Fax: +421-2-50703-444
> > e-mail: michal.durdina@xxxxxxxxxxxx
> > 
> > http://www.assetsoft.sk 
> > 
> > 
> --+------------------------------------------------------------------
> > 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@xxxxxxxxxxxxxxxxxxxxxx>
> > --+--
> > 
> > 
> 
> 
> --+------------------------------------------------------------------
> 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@xxxxxxxxxxxxxxxxxxxxxx>
> --+--
> 
> 

Current Thread