[xquery-talk] Using functions in replacement argument withfn:replace()?

Michael Kay mhk at mhk.me.uk
Thu Jan 12 18:12:08 PST 2006


> 
> but this gives unexpected output:
> 
>    replace("abc", ".", upper-case("$0")) => "abc"  [???!!!]

upper-case("$0") is "$0", so this is equivalent to writing

replace("abc", ".", "$0")

which is "abc".
> 
> and this produces a run-time error:
> 
>    replace("abc", ".", upper-case($0))

It should be a static error: $0 is not a valid XPath expression.
> 
> Using a different function,
> 
>   replace("123", "2", string(number("2") * 2))  => "143"

string(number("2") * 2) is "4", so this is equivalent to

replace("123", "2", "4")
> 
> but
> 
>   replace("123", "2", string(number("$0") * 2)) => 1NaN3

number("$0") is NaN, so this is equivalent to

replace("123", "2", "NaN")
> 
> I'm not clear from the W3C XPath 2.0 documentation whether the
> replacement argument of fn:replace() is supposed to be a literal
> xs:string, or whether any expression evaluating to a string is
> permissible.

It can be any expression evaluating to a string.

I think that what you haven't grasped is that the argument is evaluated
first, and then any $0 in the resulting string is interpreted. So you could
for example do

replace("123", "2", concat("[$", 1 + 2 - 3, "]"))

and the result would be "1[2]3".

Your examples suggest that you're thinking of $0 as an XPath expression that
can be evaluated in its own right, that isn't the case.

Michael Kay
http://www.saxonica.com/




More information about the talk mailing list