Subject: Re: Recursive Templates From: Michael Stillwell <mjs@xxxxxxxxx> Date: Mon, 2 Aug 1999 10:58:09 +1000 (EST) |
Tony Graham <tgraham@xxxxxxxxxxxxxxxx> wrote: : At 2 Aug 1999 03:12 +1000, Michael Stillwell wrote: : > I've just started using XSL and am wondering how to achieve the : > transformation such as the following. I want to transform : > : > <section>Introduction</section> : > : > into (say) : > : > <caps><strong>Introduction</strong></caps> : > : > My first attempt used templates like : > : > <xsl:template match="emph" name="emph"> : > <strong> : > <xsl:apply-templates/> : > </strong> : > </xsl:template> : > : > <xsl:template match="section"> : > <caps> : > <emph> : > <xsl:apply-templates/> : > </emph> : > </caps> : > </xsl:template> : > : > Unfortunately, the <emph> ... </emph> tags produced but the "section" : > template are not transformed into <strong> ... </strong> tags. I : > more or less understand why this is, but the best set of templates I : > have found that do what I want are : : You appear to be confusing the source tree and the result tree. When : it's time to process a particular node in the source tree, the XSL : processor finds the xsl:template with the best matching "match" : attribute and uses the body of that xsl:template to add (or not add) : nodes to the result tree. The <emph> in your xsl:template is added to : the result tree, and that's all that happens to it. It doesn't get : any templates applied to it. I guess I didn't explain myself very well. My actual problem is "topologically" identical to the problem I presented, but involves more elaborate transformations. In particular, I want some of the text that is transformed by the "strong" template to come from the "caps" template, and some from the source tree. e.g transforming <section>Introduction</section> into <caps><emph>[Introduction]</emph></caps> This could be accomplished with a recursive rule like <xsl:template match="section"> <caps> <strong> [<xsl:apply-templates/>] </strong> </caps> </xsl:template> But recursive rules don't work! I don't think the templates suggested below can easily be modified to handle this case; the only way I know of doing this involves the passing parameters to a template mechanism. (I want the "strong" to "emph" transformation to be a separate rule because in my case, much more text is involved, because I want to apply the transformation in more than one place, etc.) Michael : > <xsl:template match="emph" name="emph"> : > <strong> : > <xsl:copy-of select="$content"/> : > </strong> : > </xsl:template> : > : > <xsl:template match="section"> : > <caps> : > <xsl:call-template name="emph"> : > <xsl:with-param name="content"> : > <xsl:apply-templates/> : > </xsl:with-param> : > </xsl:call-template> : > </caps> : > </xsl:template> : : There are many better ways. I gave a version earlier with a single : xsl:template. If you really want to do it with multiple xsl:template : elements, try: : : <xsl:template match="emph" name="emph"> : <strong> : <xsl:apply-templates/> : </strong> : </xsl:template> : : <xsl:template match="section"> : <caps> : <xsl:call-template name="emph"/> : </caps> : </xsl:template> -- :::: mjs@xxxxxxxxx ::::::::::::::::::::::::::::: http://beebo.org :::: :::: mjs@xxxxxxxxx ::::::::::::::::::::::::::::: http://beebo.org :::: :::: mjs@xxxxxxxxx ::::::::::::::::::::::::::::: http://beebo.org :::: XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: Recursive Templates, Tony Graham | Thread | fop ... getting it to run, Eric Smith |
Re: Recursive Templates, Tony Graham | Date | FO's. whitespace or white-space? (R, Paul Tchistopolskii |
Month |