Search code examples
xslt-1.0xsl-foapache-fop

Unable to Successfully Pass Parameters to xsl:call-template


I have a generic template I've designed with 2 params title and category.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:param name="category" />
    <xsl:param name="title" />
    <xsl:template name="test-group">
        <fo:block>
            <xsl:value=of select="$title" />
        </fo:block>
        <fo:block>
            <xsl:value-of select="$category" />
        </fo:block>
    </xsl:template>
</xsl:stylesheet>

In the parent template I have the following:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:include href="templates/generic_template.xsl" />
    ...
    <xsl:call-template name="test-group">
        <xsl:with-param name="category" select="'animals'" />
        <xsl:with-param name="title" select="'DOGS'" />
    </xsl:call-template>
    ...
</xsl:stylesheet>

However, when the transform completes title and category are blank. I'm using FOP 2.0 so I'm not sure if this is a known shortcoming.


Solution

  • When defining a xsl:template that takes parameters, the parameter names used within the xsl:template should be declared using xls:param elements nested within.

    <xsl:template name="test-group">
      <xsl:param name="category" />
      <xsl:param name="title" />
      ...
    </xsl:template>
    

    The parameters being attached to the xsl:template and not the xsl:stylesheet. This is similar to when calling the template with xsl:call-template, except you are specifying the values instead using xsl:with-param.