Subject: XSL macros stronger then XSLT From: "Oren Ben-Kiki" <oren@xxxxxxxxxxxxx> Date: Thu, 29 Apr 1999 13:46:26 +0200 |
I've started converting my XSL stylesheets to XSLT and encountered the following problem. It seems as though <xsl:macro> can not be (in general) converted to a named template. The missing feature is an equivalent to <xsl:contents/>. Consider the following simplified (old) XSL sheet fragment: <xsl:macro name="InnerWrapper"> <xsl:macro-arg name="Element"/> <xsl:element name="{arg(Element)}"> <xsl:attribute name="A">a value</xsl:attribute> <xsl:contents/> </xsl:element> </xsl:macro> <xsl:macro name="OuterWrapper"> <xsl:macro-arg name="Element"/> <xsl:choose> <xsl:when test="... complex test ..."> <xsl:element name="WRAP"> <xsl:invoke-macro name="InnerWrapper"> <xsl:arg name="Element" value="{arg(Element)}"/> <xsl:contents/> </xsl:invoke-macro> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:invoke-macro name="InnerWrapper"> <xsl:arg name="Element" value="{arg(Element)}"/> <xsl:contents/> </xsl:invoke-macro> </xsl:choose> </xsl:macro> <xsl:template match="C"> <xsl:invoke-macro name="OuterWrapper"> <xsl:arg name="Element">E</xsl:param> <xsl:attribute name="B">b value</xsl:attribute> <xsl:apply-templates/> </xsl:call-template> </xsl:template> Trying to convert it to (new) XSLT yields: <xsl:template name="InnerWrapper"> <xsl:param-variable name="Element"/> <xsl:element name="{$Element}"> <xsl:attribute name="A">a value</xsl:attribute> ??? here's the problem ??? </xsl:element> </xsl:template> <xsl:template name="OuterWrapper"> <xsl:param-variable name="Element"/> <xsl:choose> <xsl:when test="complex test"> <xsl:element name="WRAP"> <xsl:call-template name="InnerWrapper"> <xsl:param name="Element"> <xsl:value-of select="$Element"/> </xsl:param> ??? and here ??? </xsl:call-template> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:call-template name="InnerWrapper"> <xsl:param name="Element"> <xsl:value-of select="$Element"/> </xsl:param> ??? and here ??? </xsl:call-template> </xsl:choose> </xsl:macro> <xsl:template match="C"> <xsl:call-template name="OuterWrapper"> <xsl:param name="Element">E</xsl:param> ??? <xsl:attribute name="B">b value</xsl:attribute> ??? ??? <xsl:apply-templates/> ??? </xsl:call-template> </xsl:template> Note that this is simplified; in reality the macros assign more attributes to the elements, invoke other templates, and so on. Repeating the code for the inner wrapper is barely tolerable; repeating the code for the outer wrapper definitely isn't. What's worse, I don't see any way to work around this limitation in the XSLT draft. I started considering alternatives as to how to re-provide this feature: 1. Retreat: to <xsl:macro> and <xsl:contents>, but keeping the new <xsl:param> tags instead of the old <xsl:arg> tags. 2. Advance: allow variables to have a node-set/node-list value instead of just a string value. This has far-reaching consequences. 3. Patch: allow <xsl:contents> in named templates. It would have to be given a value when the template is invoked by matching instead of by calling; I'm not certain what this value should be - maybe the list of all children of the matched element? This could be tied to calling <xsl:apply-templates/> (with no select) - both could mean the same thing. Hmmm.... maybe we could give up on the <xsl:contents/> syntax altogether, in that case. 4. Something else? If I had to choose, I'd probably go for (3) or (1). (2) is also nice but it has to be properly thought out first. Of course, if someone comes up with a good value for (4), that would be nice. Either way, I hate to think that this feature is gone. I think I'll delay switching to the new syntax until I absolutely have to, or I find some workaround for this. Share & Enjoy, Oren Ben-Kiki XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: Dinky little XML and XSL GIFs f, Duane Nickull | Thread | Re: XSL macros stronger then XSLT, David Carlisle |
Dinky little XML and XSL GIFs for w, Alan Kennedy | Date | Calling java method, Dave Pawson |
Month |