Subject: [xsl] Re: Re: lookup-table thoughts (was Re: matching multiple times, outputting once? From: Dimitre Novatchev <dnovatchev@xxxxxxxxx> Date: Wed, 7 Nov 2001 03:44:29 -0800 (PST) |
Tom Myers wrote: [snip] > And that seems to handle the problem...unless I'm missing something. > It's interesting, I think, that even when filled in, the accumulator > pattern has no idea that the nodelist is a list of attributes...and > info about the mapping of names is confined to the lookup table. Of > course you can make it a little shorter and faster in various ways, > e.g. by bringing the call-template that defines "recresult" into > the one and only place $recresult is used, avoiding the copy-of. > But mainly it's interesting that so little thought is required. > And I'm wondering what I'm missing this time. Oh well, back to > data bases. Tom, you're not missing anything, except maybe that there are ways in XSLT to fill this general accumulator pattern by passing functions as parameters. Yes, this is possible in XSLT. Have you heard about the concept of "generic templates"? If not, here's a link explaining the concept and giving some examples: http://lists.fourthought.com/pipermail/exslt/2001-May/000169.html And the pattern you pointed out is called "fold" in Haskell. Here's the XSLT implementation of the function foldl (fold from left to right, foldr is fold from right to left), which in Haskell is defined as: foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs <xsl:template name="foldl"> <xsl:param name="pFunc" select="/.."/> <xsl:param name="pA0"/> <xsl:param name="pList" select="/.."/> <xsl:choose> <xsl:when test="not($pList)"> <xsl:copy-of select="$pA0"/> </xsl:when> <xsl:otherwise> <xsl:variable name="vFunResult"> <xsl:apply-templates select="$pFunc[1]"> <xsl:with-param name="arg0" select="$pFunc[position() > 1]"/> <xsl:with-param name="arg1" select="$pA0"/> <xsl:with-param name="arg2" select="$pList[1]"/> </xsl:apply-templates> </xsl:variable> <xsl:call-template name="foldl"> <xsl:with-param name="pFunc" select="$pFunc"/> <xsl:with-param name="pList" select="$pList[position() > 1]"/> <xsl:with-param name="pA0" select="$vFunResult"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> This is just one code example from an article I'm about to finish in a couple of days. I promise to send you the link to it as soon as possible when it is published. I would also appreciate the help of anyone who'd be interested act as a reviewer. In the meantime, I'd greatly appreciate it, if somebody could recommend where to publish this article -- it has grown quite long since it contains many many examples of XSLT implementations of major functional programming design patterns. Cheers, Dimitre Novatchev. __________________________________________________ Do You Yahoo!? Find a job, post your resume. http://careers.yahoo.com XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] IE6 xml direct browsing, Michael Beddow | Thread | [xsl] Question about XPATH result s, Tim Crook |
[xsl] reliability of MSXML, Pedro Pastor | Date | Re: [xsl] reliability of MSXML, David Carlisle |
Month |