[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