RE: [xsl] Passing parameters to an indirectly called template after matching.

Subject: RE: [xsl] Passing parameters to an indirectly called template after matching.
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 17 Apr 2008 12:14:08 +0100
It looks as if you are looking for the XSLT 2.0 facility of "tunnel
parameters".

http://www.w3.org/TR/xslt20/#tunnel-params

Michael Kay
http://www.saxonica.com/
 

> -----Original Message-----
> From: Kannan [mailto:riderchap@xxxxxxxxx] 
> Sent: 17 April 2008 11:34
> To: xsl-list
> Subject: [xsl] Passing parameters to an indirectly called 
> template after matching.
> 
> Hello group,
> 
>     I have a string replacement function. Also I have many 
> XSL files that need to make use of the replace functionality. 
> I found there is an include directive to include an XSL in 
> another XSL. So that from each XSL file I can call the 
> replacement function with necessary parameters. My problem is 
> that I am not able to 'propagate' my parameters from the 
> template calling point to the template that actually doing 
> the string replacement.
> 
>     I am calling the a template that resides in the string 
> replacement XSL, from another XSL file like this for e.g..
> 
>     <!-- In file caller.xsl -->
> 
>     <xsl:include href="replaceXSL.xsl"/>
> 
>     <xsl:template match="ATag">
>         <xsl:call-template name="ReplaceInXMLString">
>             <xsl:with-param name="theNodeMatch" select="./*"/>
>             <xsl:with-param name="stringToBeReplaced" 
> select="&quot;'&quot;"/>
>             <xsl:with-param name="replacementString" 
> select="&quot;''&quot;"/>
>         </xsl:call-template>
>     </xsl:template>
> 
>     <!--End-->
> 
>     And in replaceXSL.xsl file, now I have two global 
> variables (for "stringToBeReplaced" and "replacementString" 
> ), I don't want to use these global variables, so that I can 
> make my replacement functionality generic. How do I 
> "propagate" the parameters passed ("stringToBeReplaced" and 
> "replacementString") from the client called template 
> "ReplaceInXMLString" to the template which doing the 
> replacement functionality (the "ReplaceString" template.)
> 
>     <!-- In file replaceXSL.xsl -->
> 
>       <!-- The globals I want to get rid of. -->
>       <xsl:variable name="stringToBeReplaced" select="&quot;'&quot;"/>
>       <xsl:variable name="replacementString" select="&quot;''&quot;"/>
> 
>     <!-- This is the template the client calls. -->
>     <xsl:template name="ReplaceInXMLString">
>         <xsl:param name="theTagMatch"/>
>         <xsl:apply-templates select="msxsl:node-set(
>     $theTagMatch)"/>
>       </xsl:template>
> 
>       <xsl:template match="node()">
>         <xsl:copy>
>           <xsl:apply-templates select="@*|*|text()"/>
>         </xsl:copy>
>       </xsl:template>
> 
>       <xsl:template match="@*">
>         <xsl:attribute name="{name()}">
>           <xsl:call-template name="ReplaceString">
>             <xsl:with-param name="stringInContext" select="."/>
>             <xsl:with-param name="stringToBeReplaced"
> select="$stringToBeReplaced"/>
>             <xsl:with-param name="replacementString"
> select="$replacementString"/>
>           </xsl:call-template>
>        </xsl:attribute>
>       </xsl:template>
> 
>       <xsl:template match="text()">
>         <xsl:call-template name="ReplaceString">
>           <xsl:with-param name="stringInContext" select="."/>
>           <xsl:with-param name="stringToBeReplaced"
> select="$stringToBeReplaced"/>
>           <xsl:with-param name="replacementString" 
> select="$replacementString"/>
>         </xsl:call-template>
>       </xsl:template>
> 
>      <!-- Here is where I want the parameters I actually passed to the
>     template ReplaceInXMLString -->
>       <xsl:template name="ReplaceString">
>         <xsl:param name="stringInContext"/>
>         <xsl:param name="stringToBeReplaced"/>
>         <xsl:param name="replacementString"/>
>         <xsl:choose>
>           <xsl:when test="contains($stringInContext , 
> $stringToBeReplaced)">
>             <xsl:value-of
> select="concat(substring-before($stringInContext,
> $stringToBeReplaced),$replacementString)"/>
>             <xsl:call-template name="ReplaceString">
>               <xsl:with-param name="stringInContext"
> select="substring-after($stringInContext,$stringToBeReplaced)"/>
>               <xsl:with-param name="stringToBeReplaced"
> select="$stringToBeReplaced"/>
>               <xsl:with-param name="replacementString"
> select="$replacementString"/>
>             </xsl:call-template>
>           </xsl:when>
>           <xsl:otherwise>
>             <xsl:value-of select="$stringInContext"/>
>           </xsl:otherwise>
>         </xsl:choose>
>       </xsl:template>
> 
>     <!-- End -->
> 
>     Thank you for your time. Any help greatly appreciated.
> 
>     Thanks,
>     Kannan

Current Thread