RE: [xsl] passing a variable to call-template

Subject: RE: [xsl] passing a variable to call-template
From: "David White" <davidw@xxxxxxxxxxx>
Date: Fri, 11 Aug 2006 08:03:12 -0500
Thanks to everyone for the quick replies!

Ya, after looking over the FXSL materials my head is spinning.
I'm going to stick with the simple choose statement you mention below.

I have XML which looks like this:
<warning conformance="alert_hand_in_gears">
	<title/>
	<para/>
</warning>

And XSLT:

<xsl:variable name="this.warning">
	<xsl:choose>
		<xsl:when test="string-length($list) = 0">
		<!-- We are done -->
		</xsl:when>
		<xsl:when test="contains($list, ' ')">
		<xsl:value-of select="substring-before($list, ' ')"/>
		</xsl:when>
		<xsl:otherwise>
		<xsl:value-of select="$list"/>
		</xsl:otherwise>
	</xsl:choose>
</xsl:variable>
<xsl:if test="string-length($this.warning) &gt; 0">
	<xsl:choose>
		<xsl:when test="$this.warning = 'alert_hand_in_gears'"><xsl:call-template
name="alert_hand_in_gears"/></xsl:when>

		<xsl:otherwise><fo:inline color="red" font-size="6pt" width="38pt"
font-weight="bold">ART NOT FOUND <xsl:value-of
select="$this.warning"/></fo:inline></xsl:otherwise>
		</xsl:choose>

So, I'm hoping to be able to dynamically pull templates based upon the
conformance attribute in the XML.  This.warning is a template that contains
only an SVG.  It would be nice to do this dynamically from the XML but looks
like its just easier to hard code the values.

David White

-----Original Message-----
From: andrew welch [mailto:andrew.j.welch@xxxxxxxxx]
Sent: Friday, August 11, 2006 7:54 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] passing a variable to call-template

On 8/11/06, David White <davidw@xxxxxxxxxxx> wrote:
> Is this possible?
>
> <xsl:call-template name="{$this.warning}"/>
>
> I would like to pass a variable into call-template but haven't had any
luck.

No this isn't possible as the name attribute must contain a qname,
which means it must be known at compile time... the usual way is:

<xsl:choose>
  <xsl:when test="$this.warning = 'red'">
    <xsl:call-template name="red"/>
  </xsl:when>
  <xsl:when test="$this.warning = 'green'>
    <xsl:call-template name="green"/>

etc... although it's highly likely you can achieve what you are trying
to do another way, maybe post some examples showing your requirements
and see if there's a better solution...

cheers
andrew

Current Thread