The problem that when the recursive template is a matching
template instead of a named template, it is hard for the
processor to recognize that the apply-templates at the end of
the template will result in the same template being applied.
For example, Robert's second example has this:
<xsl:template match="group">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="./city"/>
</xsl:copy>
<xsl:apply-templates select="./group"/>
</xsl:template>
I don't know if any processors can optimize this.
It's true that Saxon today only does tail-recursion optimization on a
self-recursive call-template instruction. In principle, however, any
call done as the last thing in a routine can be optimized in this way,
it doesn't have to be a self-recursive call. So it's quite possible in
principle to optimize this one even if you can't recognize it as being
self-recursive.
Michael Kay
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list