Re: [xsl] Return value from a template 2...

Subject: Re: [xsl] Return value from a template 2...
From: Ruud Grosmann <r.grosmann@xxxxxx>
Date: Wed, 23 Jan 2008 09:55:46 +0100
Batis DAVE wrote:
I want to return a value from a template(getIdList). The returned
value is saved in a variable ($idList) and is a string wich is the
concatenation  of my nodes id : id1,id2,id3,...
I use this code wich is not working... i got nothing when i display
the variable value...!!

Here's my code:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
<xsl:output indent="yes" method="html" omit-xml-declaration="no"
encoding="ISO-8859-1" />
<xsl:param name="delimiter" select="','"/>

       <xsl:template match="/root">
               <xsl:variable name="idList">
                       <xsl:call-template select="/root/vid" name="getIdList" />
               </xsl:variable>
               <xsl:value-of select="$idList"/>
       </xsl:template>

       <xsl:template match="/root/vid" name="getIdList">
               <xsl:for-each select=".">
                       <xsl:variable name="var"
select="concat($var,ids, $delimiter)"/>
               </xsl:for-each>
               <xsl:value-of select="$var"/>
       </xsl:template>

</xsl:stylesheet>

What's wrong in it? is there another simple way to get what i want?


Hi Dave,

for the first, you cannot pass parameters to a template with select and match.
The other problem is the scope of the variable 'var'. It only lives within the scope of the for-each. So if you try to get a value from it outside the foreach it is empty (it is not defined)


See the stylesheet below for a newbie-solution. It uses recursion.

regards, Ruud

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
<xsl:output indent="yes" method="html" omit-xml-declaration="no"
encoding="ISO-8859-1" />


<xsl:param name="delimiter" select="','"/>

<xsl:template match="/root">
  <xsl:variable name="idList">
    <xsl:call-template name="getIdList">
      <xsl:with-param name='list' select="/root/vid"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:value-of select="$idList"/>
</xsl:template>

<xsl:template name="getIdList">
  <xsl:param name='list'/>

<xsl:if test="count($list) > 0">
<xsl:value-of select='$list[1]'/>
<xsl:text>,</xsl:text>
<xsl:call-template name="getIdList" >
<xsl:with-param name='list' select="$list[1]/following-sibling::*"/>
</xsl:call-template>
</xsl:if>
</xsl:template>


</xsl:stylesheet>

Current Thread