Re: [xsl] Cannot mix nodes and atomic values - how comes?

Subject: Re: [xsl] Cannot mix nodes and atomic values - how comes?
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 11 Nov 2016 11:21:51 -0000
> On 11 Nov 2016, at 10:30, Michael MC<ller-Hillebrand mmh@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi experts,
>
> We ran into an error that made me think about the idea of mixed data types
in sequences. Take this instance:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <bars>
> <bar foo="x"/>
> <bar/>
> </bars>
>
> We need to process all <bar> and want to have a default value if @foo is not
present. When trying this XPath:
>
> for $i in //bar/(@foo, 'no-foo')[1] return $i
>
> we get the error "XPath failed due to: Cannot mix nodes and atomic values in
the result of a path expression"

This is because the "/" operator is defined to remove duplicates and sort into
document order if the expression delivers nodes, but not if it delivers atomic
values. If it delivers a mixture, the semantics would become very unclear.
Hence the need for the "!" operator in 3.0.

>
> When building the XPath the following way it runs fine and creates a
sequence of an attribute and a string:
>
> for $b in //bar return for $i in $b/(@foo, 'no-foo')[1] return $i

Here each evaluation of "/" delivers either all-nodes, or all-atomic-values.
>

Michael Kay
Saxonica

Current Thread