|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: apply-imports and recursion used together
Hi Tom,
> Can someone explain to me the technical reason behind the following:
>
> The following template exists in an imported stylesheet:
>
> <xsl:template match="FORUMTHREADPOSTS" mode="postblocks">
> <xsl:param name="skip" select="0"/>
> <xsl:param name="PostRange" select="concat(($skip + 1), ' - ', ($skip +
> @COUNT))"/>
> <xsl:param name="postblockon" select="concat($alt_nowshowing, ' ',
> $PostRange)"/>
> <xsl:param name="postblockoff" select="concat($alt_show, ' ',
> $PostRange)"/>
[snip]
> <xsl:if test="($skip + @COUNT) < @TOTALPOSTCOUNT">
> <xsl:apply-templates select="." mode="postblocks">
> <xsl:with-param name="skip" select="$skip + @COUNT"/>
> </xsl:apply-templates>
> </xsl:if>
> </xsl:template>
>
> The template works in the way I would expect it. However if an
> apply-imports template is used in the including template I get an
> infinite loop:
>
> <xsl:template match="FORUMTHREADPOSTS" mode="postblocks">
> <xsl:apply-imports/>
> </xsl:template>
Note that when you apply imports you don't (cannot) pass any
parameters to the imported template. So say the above template gets
called; it calls the imported template and since it's called with no
parameters, the default values are used for those parameters. In
particular, $skip is 0.
$skip of 0 means that the stopping condition in your recursive
template is passed, and templates are applied to the same
<FORUMTHREADPOSTS> element, with $skip adjusted.
But the template that gets used is the one from you *importing*
stylesheet; this ignores the updated value of the $skip parameter and
just applies imports, again with the default values for all the
parameters.
So you get infinite recursion because the $skip parameter gets lost
when you apply imports. In XSLT 2.0, <xsl:apply-imports> can have
<xsl:with-param> children, so you'll be able to do:
<xsl:template match="FORUMTHREADPOSTS" mode="postblocks">
<xsl:param name="skip" select="0" />
<xsl:apply-imports>
<xsl:with-param name="skip" select="$skip" />
</xsl:apply-imports>
</xsl:template>
which will fix the problem.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








