This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: mapping (Was: Re: Re: . in for)
- From: Jeni Tennison <jeni at jenitennison dot com>
- To: XSL List <xsl-list at lists dot mulberrytech dot com>
- Date: Thu, 10 Jan 2002 12:32:16 +0000
- Subject: Re: mapping (Was: Re: [xsl] Re: . in for)
- Organization: Jeni Tennison Consulting Ltd
- References: <3C3D60E8.F3DA5D45@zkb.ch>
- Reply-to: xsl-list at lists dot mulberrytech dot com
Hi Joerg,
> Jeni Tennison <jeni@jenitennison.com> wrote:
>> Function names are indistinguishable from element names,
> [...]
> Well, i realized it somewhat too late as you have seen in my
> follow-up...
Sure :) I'd just sent my message when yours came through.
> This means you want lambda expressions.
Yes please :)
>> - define a map expression (rather than a map() function)
>
> Note that in you proposal of a mapping operator
> $coordinates -> (. * 2)
> the second operand actually *is* already a lambda expression. Hint:
> the . is not bound to the value of the context node as it would
> have been in ordinary expressions.
Yes, I thought so, but I'm not an expert on this functional
programming stuff so I didn't want to claim too much. I think it gives
you lambda expressions in a limited set of circumstances, without
adding lambda expressions as objects in the data model (which I
personally can't see happening in XPath 2.0 - there's just too much
else to sort out).
Now you could see that as a step in the right direction, or you could
see it as potentially undermining future efforts to introduce lambdas
as full objects within XPath/XSLT, because it doesn't introduce a
syntax that discriminates between a lambda expression and a normal
expression.
One possibility would be to use a keyword to indicate a lambda
expression, so you'd do:
LambdaExpr ::= "expression" "(" Expr ")"
MapExpr ::= Expr "map" LambdaExpr
and then have:
$coordinates map expression (. * 2)
map expression (if (position() mod 2)
then . + 50 else .)
We could cover up the fact we were doing this by pretending that the
syntax was simply:
MapExpr ::= Expr "map" "expression" "(" Expr ")"
But it would mean that in XPath 3.0 then we could change Expr to
include LambdaExpr. Then you could do (with a properly-defined sum()
function):
sum(item, expression (item * price))
It's a bit sneaky, but it might just work...
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list