[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: [xsl] how to capture a value returned by a template call into a variable
Subject: Re: [xsl] how to capture a value returned by a template call into a variable From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Thu, 9 Jan 2003 09:50:41 +0000 |
Hi Anthony, > I would like to modularise some common code as a function. But in > XSLT 1.0 there is no function facility. My common code involved is > to tranlate a DB type into a java type. That is what i have done: > > <xsl:variable name="java_type"> > <xsl:call-template name="translate_type"> > <xsl:with-param name="db_type" select="@jdbc-type"/> > </xsl:call-template> > </xsl:variable> > > I intended (wish, actually :-) to capture the result into variable > "java_type". However it failed. [later...] > The template is as such: > > <xsl:template name="translate_type" > > <xsl:param name="db_type" /> > <xsl:choose > > <xsl:when test="$db_type='CHAR'">String</xsl:when> > <xsl:when test="$db_type='VARCHAR'">String</xsl:when> [snip] > </xsl:choose> > </xsl:template> I don't know why your template call failed. Perhaps the current node at the point you set your variable is not what you think it is -- you should check whether the correct value is being passed through as the $db_type parameter. In this particular case, a better approach would be to create an XML lookup table, say in db_types.xml, which looked like: <db_types> <db_type java="String">CHAR</db_type> <db_type java="String">VARCHAR</db_type> ... </db_types> You could then look up the value that you wanted to translate using a single XPath as follows: <xsl:variable name="db_types" select="document('db_types.xml')/db_types/db_type" /> <xsl:variable name="java_type" select="$db_types[. = current()/@jdbc-type]/@java" /> In other words, find the <db_type> element from db_types.xml whose value is the same as the jdbc-type attribute on the current node, and then find the value of its java attribute. But to answer your more general question, you're correct that in unextended XSLT 1.0 you have to call templates to perform functions and that sometimes this can lead to verbose and ungainly code. However, most XSLT processors have a mechanism for defining extension functions. Several support EXSLT's func:function/func:result elements, which enable you to do: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:func="http://exslt.org/functions" xmlns:db="http://www.example.org/db" extension-element-prefixes="func db"> <func:function name="db:translate_type"> <xsl:param name="db_type" /> <func:result> <xsl:choose> <xsl:when test="$db_type='CHAR'">String</xsl:when> <xsl:when test="$db_type='VARCHAR'">String</xsl:when> ... </xsl:choose> </func:result> </func:function> ... <xsl:variable name="java_type" select="db:translate_type(@jdbc-type)" /> ... </xsl:stylesheet> See http://www.exslt.org/func/elements/function/index.html for details. XSLT 2.0 will support user-defined functions written using XSLT with xsl:function/xsl:result elements that work in roughly the same way as func:function/func:result. See http://www.w3.org/TR/xslt20/#stylesheet-functions. Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] how to capture a value re, Anthony Kong | Thread | Re: [xsl] how to capture a value re, S Woodside |
Re: [xsl] Beginner: adding xmlns:mm, Roel Vanhout | Date | RE: [xsl] how to capture a value re, Edward . Middleton |
Month |