Subject: Re: the joy of breaking out from procedural/imperative programming style (was: Re: [xsl] Peculiar Problem in .xsl file From: "Kurt Cagle" <cagle@xxxxxxxxx> Date: Fri, 6 Dec 2002 11:36:34 -0800 |
The difference between the two models -- one as a tokenized sequence, the other as a node-set, is not in fact all that dramatic; In essence, the XML version provides a mapping between two strings -- the month indicator "04" and the month name "April", while the sequence provides the mapping between a position in a list and the month name. What the tokenize() function does is to give a useful mechanism for creating sequences, in effect raising sequences to the same level as XML element/attribute nodes. The advantage here is that you can store information more compactly, while still utilizing the power of XPath/XSLT. For instance, <monthDesignators> <months lang="EN-US" names="January,February,March,April,May,June,July,August,September,October,N ovember,December" delimiter=","/> <months lang="DE" names="Januar;Februar;März;April;Mai;Juni;Juli;August;September;Oktober;Nove mber;Dezember" delimiter=";"/> <months lang="ES" names="Enero Febrero Marcha Abril Pueda Junio Julio Agosto Septiembre Octubre Noviembre Diciembre" delimiter=" "/> </monthDesignators> <xsl:function name=" dt:getMonthName" xmlns:dt="http://www.mySchemas.com/date"> <xsl:param name="date"/> <xsl:param name="lang"/> <xsl:variable name="monthDesignators" select="document('monthDesignators.xml')//months[@lang=$lang]"/> <xsl:variable name="months" select="tokenize($monthDesignators/@names,$monthDesignators/@delimiter)"/> <xsl:return select="$months[number(substring($monthNum,5,2))]"/> </xsl:function> The significance here is that from the standpoint of XSLT2/XPath2, there is no real difference between a sequence of nodes and a sequence of strings - they are both sequences. XSLT2 is perhaps not quite so disposed to sequences -- you can do an <xsl:for-each> but not an <xsl:apply-templates> with non-nodal sequence content, but even there, you can always create a node from a non-node. -- Kurt ----- Original Message ----- From: "Gunther Schadow" <gunther@xxxxxxxxxxxxxxxxxxxxxx> To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx> Sent: Friday, December 06, 2002 10:49 AM Subject: Re: the joy of breaking out from procedural/imperative programming style (was: Re: [xsl] Peculiar Problem in .xsl file > Well, I would caution about your solution, Kurt: > > > <xml:function name=" dt:getMonthName" xmlns:dt="http://www.mySchemas.com/date"> > > <xsl:param name="date"/> > > <xsl:variable name="months" > > select="tokenize("January,February,March,April,May,June,July,August,Septembe > > r,October,November,December",',')"/> > > <xsl:return select="$months[number(substring($monthNum,5,2))]"/> > > </xsl:function> > > > I would agree that the function is nicer than having to do the xpath > to select the month names from my table. BUT, I would want to stress > the point that most all of the data that drives your transforms should > be expressed as XML instances, and not hidden in expressions such as > in xsl:when/@test clauses or in the nifty tokenize value in the > function body. > > So, the fusion of our two ideas would be this: > > <xsl:variable name="monthNames"> > <month digits="01" name="January"/> > <month digits="02" name="February"/> > <month digits="03" name="March"/> > <month digits="04" name="April"/> > <month digits="05" name="May"/> > <month digits="06" name="June"/> > <month digits="07" name="July"/> > <month digits="08" name="August"/> > <month digits="09" name="September"/> > <month digits="10" name="October"/> > <month digits="11" name="November"/> > <month digits="12" name="December"/> > <xsl:variable> > > > <xsl:function name="dt:monthName" > xmlns:dt="http://www.mySchemas.com/date"> > <xsl:param name="date"/> > <xsl:return > select="$monthNames/ > month[@digits=substring($date, 5, 2)][1]/@name"/> > </xsl:function> > > so that you can still say > > <xsl:value-of select="dt:monthName($date)"/> > > but you could add other attributes to the months (e.g., how about the > duration of each month in days, language code, etc.) and you still > could easily load such a table from an external locale resource and > you can manage these tables as XML data rather than special strings. > > > Functional Programming at its most basic. > > > I found David Carlisle's comment most interesting, he said: > > > > except they still managed to miss out the most basic property of > > functional programming languages, the ability to manipulate functions as > > data. But yes I agree that having user defined functions will be a big > > win. (shame about the rest of xpath2 though:-) > > > Two points: > > #1 the function is data, but I'd have to do code generation to handle > it as data and then execute the generated style sheet to execute > the function. Of course far inferior from just executing an XML > form that happens to be a lambda expression. I still don't like > the fact that XPath is so different from XML data. > > #2 what do you mean when you say "shame about the rest of xpath2 > though"? Aren't you one of the guys "in control" of that spec? > > > regards, > > -Gunther > > -- > Gunther Schadow, M.D., Ph.D. gschadow@xxxxxxxxxxxxxxx > Medical Information Scientist Regenstrief Institute for Health Care > Adjunct Assistant Professor Indiana University School of Medicine > tel:1(317)630-7960 http://aurora.regenstrief.org > > > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: the joy of breaking out from pr, Gunther Schadow | Thread | Re: the joy of breaking out from pr, David Carlisle |
[xsl] Calling a template dynamicall, Charles Ohana | Date | Re: [xsl] FOP calling a template dy, Charles Ohana |
Month |