[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Calling templates with (defaulted) params
Hi, in an XSLT that processes an XML description to produce HTML, I would like to be able to define any number of small "rendering" templates for logical elements that I wish to define. To make the templates reusable, they are parametrized. The question is the number of parameters may be long, and having to state a value for each one each time the template is called is not convenient. Is it possible to reduce overheaviness (i.e. not replace it by something just as heavy somewhere else in the code ;-) by having each template decide default values for each parameter, and uses it in each case a parameter is not specified ? In the small example below, imagine a logical "section", represented by the <icm key="Section">, and a single param. This is processed by the proposed XSLT, to call a template called "Section" that expects 2 params. Imagine that the non-specified param should assume some value, e.g. 'no value for note heading!'. Two ways of calling the template "Section" are included below, one with no defaults, and one with defaults, which is significantly heavier (and this is an example with only 2 params!). My question is, are there other lighter ways to do this in XSLT? Any improvements anyone can suggest? Any optimization should be in favour of many such templates, each with possibly many parameters. And, any shortcuts should also favour the source xml description rather than the xsl that processes it. tia, and best regards, Mario Ruggier ==== xml source ==== ... <icm key="Section"> <param name="heading" value="Section Heading" /> .... </icm> ... ===== xsl source ==== <xsl:output method="html" indent="yes" /> <!-- icm template wrapper to call templates according to @key value --> <xsl:template match="icm"> <xsl:variable name="icm-key" select="@key" /> <xsl:choose> .... <xsl:when test="$icm-key='Section'"> <!-- no defaulting... --> <xsl:call-template name="Section" > <xsl:with-param name="heading" select="param[@name='heading']/@value" /> <xsl:with-param name="headingNote" select="param[@name='headingNote']/@value" /> </xsl:call-template> <!-- with defaulting... --> <xsl:call-template name="Section" > <xsl:with-param name="heading"> <xsl:call-template name="get-defaulted-value"> <xsl:with-param name="proposed-value" select="param[@name='heading']/@value" /> <xsl:with-param name="default-value" select="'no value for heading!'" /> </xsl:call-template> </xsl:with-param> <xsl:with-param name="headingNote" <xsl:call-template name="get-defaulted-value"> <xsl:with-param name="proposed-value" select="param[@name='headingNote']/@value" /> <xsl:with-param name="default-value" select="'no value for heading note!'" /> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:when> ... </xsl:choose> </xsl:template> ... <!-- other templates .--> <xsl:template name="Section" > <xsl:param name="heading" /> <xsl:param name="headingNote" /> <table border="0" cellspacing="2" cellpadding="2" > <tr valign="top" align="left"> <th bgcolor="#99ffff"><xsl:value-of select="$heading" /></th> <td><xsl:value-of select="$headingNote" /></td> </tr> <xsl:apply-templates /> </table> </xsl:template> ... <!-- "defaulting" function --> <xsl:template name="get-defaulted-value"> <xsl:param name="proposed-value" /> <xsl:param name="default-value" /> <xsl:choose> <xsl:when test="$proposed-value"><xsl:value-of select="$proposed-value" /></xsl:when> <xsl:otherwise><xsl:value-of select="$default-value" /></xsl:otherwise> </xsl:choose> </xsl:template> ======== 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
|