RE: [xsl] use choose in call-templates not possble

Subject: RE: [xsl] use choose in call-templates not possble
From: Jakub Malý <jakub@xxxxxxx>
Date: Thu, 10 May 2012 14:39:55 +0200
You can also use if-then-else in select (XPath/XSLT 2.0). 

<xsl:call-template name="translateDcml">
	<xsl:with-param name="factor" select="if (FCDecimalPlace  != '')
then FCDecimalPlace else LCDecimalPlace"/>
</xsl:call-template>

> -----Original Message-----
> From: G. Ken Holman [mailto:gkholman@xxxxxxxxxxxxxxxxxxxx]
> Sent: Thursday, May 10, 2012 2:34 PM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx; xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] use choose in call-templates not possble
> 
> At 2012-05-10 13:25 +0100, henry human wrote:
> >    <xsl:variable name="Fcfactor">
> >       <xsl:call-template name="translateDcml">
> >       <xsl:choose>
> >       <xsl:when test="FCDecimalPlace  != ''">
> >
> >
> >        <xsl:with-param name="factor" select="FCDecimalPlace"/>
> >
> >       <xsl:otherwise>
> >       <xsl:with-param name="factor" select="LCDecimalPlace"/>
> >         </xsl:otherwise>
> >         </xsl:choose>
> >      </xsl:call-template>
> >      </xsl:variable>
> 
> You do not show how you are working with $factor and that affects the
> answer. You are passing a node in your old code.
> 
> If you need a node in the function, then the ways are:
> 
> In XSLT 1:
> 
>     <xsl:variable name="Fcfactor">
>        <xsl:choose>
>          <xsl:when test="FCDecimalPlace  != ''">
>            <xsl:call-template name="translateDcml">
>               <xsl:with-param name="factor" select="FCDecimalPlace"/>
>            </xsl:call-template>
>          </xsl:when>
>          <xsl:otherwise>
>            <xsl:call-template name="translateDcml">
>               <xsl:with-param name="factor" select="LCDecimalPlace"/>
>            </xsl:call-template>
>          </xsl:otherwise>
>        </xsl:choose>
>     </xsl:variable>
> 
> In XSLT 2:
> 
>     <xsl:variable name="Fcfactor">
>       <xsl:call-template name="translateDcml">
>          <xsl:with-param name="factor" as="node()">
>            <xsl:choose>
>              <xsl:when test="FCDecimalPlace  != ''">
>               <xsl:sequence select="FCDecimalPlace"/>
>              </xsl:when>
>              <xsl:otherwise>
>               <xsl:sequence select="LCDecimalPlace"/>
>              </xsl:otherwise>
>            </xsl:choose>
>         </xsl:with-param>
>       </xsl:call-template>
>     </xsl:variable>
> 
> If you need only the value to be passed then this works with both XSLT 1
and
> XSLT 2 by passing a temporary tree with the value:
> 
>     <xsl:variable name="Fcfactor">
>       <xsl:call-template name="translateDcml">
>          <xsl:with-param name="factor">
>            <xsl:choose>
>              <xsl:when test="FCDecimalPlace  != ''">
>               <xsl:value-of select="FCDecimalPlace"/>
>              </xsl:when>
>              <xsl:otherwise>
>               <xsl:value-of select="LCDecimalPlace"/>
>              </xsl:otherwise>
>            </xsl:choose>
>         </xsl:with-param>
>       </xsl:call-template>
>     </xsl:variable>
> 
> The whole key is to put the choice inside the value of the parameter.
> 
> I hope this helps.
> 
> . . . . . . . . . Ken
> 
> --
> Public XSLT, XSL-FO, UBL and code list classes in Europe -- Oct 2012
Contact us
> for world-wide XML consulting and instructor-led training Free 5-hour
> lecture: http://www.CraneSoftwrights.com/links/udemy.htm
> Crane Softwrights Ltd.            http://www.CraneSoftwrights.com/s/
> G. Ken Holman                   mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
> Google+ profile: https://plus.google.com/116832879756988317389/about
> Legal business disclaimers:    http://www.CraneSoftwrights.com/legal

Current Thread