[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: how to capture a value returned by a template call
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
|
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
|