The <xsl:apply-templates> element applies a template to the current element or to
the current element's child nodes.
If we add a select attribute to the <xsl:apply-templates> element it will process only the
child element that matches the value of the attribute. We can use the select attribute to
specify the order in which the child nodes are processed.
The <xsl:call-template> element calls a named template.
<xsl:call-template name="templatename">
<!-- Content:xsl:with-param* -->
</xsl:call-template>
Note:
In terms of raw performance xsl:call-template is likely to be faster, as you are
calling a specific named template, rather than telling the XSLT processor to
pick the template which best matches
With call-template you have to know what you're calling. apply-templates is
polymorphic - what gets called depends on what you find in the input, which
means it is the key feature that enables XSLT to respond to variable or
unpredictable input - essential when handling documents as distinct from
structured data.
apply-templates is usually (but not necessarily) used to process all or a subset
of children of the current node with all applicable templates. This supports the
recursiveness of XSLT application which is matching the (possible)
recursiveness of the processed XML.
call-template on the other hand is much more like a normal function call. You
execute exactly one (named) template, usually with one or more parameters.