Re: [xsl] XQuery/XPath 3.1: Node List to Node Set ("distinct nodes")

Subject: Re: [xsl] XQuery/XPath 3.1: Node List to Node Set ("distinct nodes")
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 29 Dec 2021 23:24:39 -0000
> No, it doesn't seem to be fixed, Mike's implementation seems to try be
> smarter than the spec allows and his own coding assumes :)

Seems BaseX rules!

And glad to be a contributor to the eventual future improvement of Saxon :)

Cheers,
Dimitre

On Wed, Dec 29, 2021 at 12:17 PM Martin Honnen martin.honnen@xxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> On 29.12.2021 20:59, Dimitre Novatchev dnovatchev@xxxxxxxxx wrote:
> >   document (fragments?) are involved.
> >
> > Yes, bugs happen...
> >
> > Just trying to evaluate Dr. Kay's fold-left solution with Saxon (EE9.1.7
> > via Oxygen) I am getting a result of 20 nodes but the correct must be
> > just 3 nodes. BaseX correctly evaluates the XPath expression and
> > produces the right 3-nodes result.
> >
> > Xml document:
> > <t>
> >    <a/>
> >    <b/>
> >    <c/>
> > </t>
> >
> > XSLT stylesheet:
> >
> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform
> > <http://www.w3.org/1999/XSL/Transform>" version="3.0">
> >    <xsl:output omit-xml-declaration="yes"/>
> >    <xsl:template match="/">
> >      <xsl:sequence select=
> >        "let $xml := /,
> >        $nodes := (/*/a, /*/c, /*/b, /*/a, /*/b, /*/a, /*/c, /*/b, /*/a,
> > /*/b,
> >        /*/a, /*/c, /*/b, /*/a, /*/b, /*/a, /*/c, /*/b, /*/a, /*/b,
> >        /*/a, /*/c, /*/b, /*/a, /*/b, /*/a, /*/c, /*/b, /*/a, /*/b,
> >        /*/a, /*/c, /*/b, /*/a, /*/b, /*/a, /*/c, /*/b, /*/a, /*/b,
> >        /*/a, /*/c, /*/b, /*/a, /*/b )
> >        return
> >          $nodes => fold-left((), function($all, $this) {$all, $this
> > except $all})"/>
> >    </xsl:template>
> > </xsl:stylesheet>
> >
> > Result produced when run with Saxon-EE (and also PE) 9.9.1.7 via Oxygen:
> >
> >
> <a/><c/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/>
> >
> > Evaluating the below expression with Saxon-EE XQuery9.9.1.7 also
> > produces the same unexpected result:
> >
> > let $xml := parse-xml("<t><a/><b/><c/></t>"),
> >      $nodes := ($xml/*/a, $xml/*/c, $xml/*/b, $xml/*/a, $xml/*/b,
> > $xml/*/a, $xml/*/c, $xml/*/b, $xml/*/a, $xml/*/b, $xml/*/a, $xml/*/c,
> > $xml/*/b, $xml/*/a, $xml/*/b, $xml/*/a, $xml/*/c, $xml/*/b, $xml/*/a,
> > $xml/*/b, $xml/*/a, $xml/*/c, $xml/*/b, $xml/*/a, $xml/*/b, $xml/*/a,
> > $xml/*/c, $xml/*/b, $xml/*/a, $xml/*/b,$xml/*/a, $xml/*/c, $xml/*/b,
> > $xml/*/a, $xml/*/b, $xml/*/a, $xml/*/c, $xml/*/b, $xml/*/a, $xml/*/b,
> > $xml/*/a, $xml/*/c, $xml/*/b, $xml/*/a, $xml/*/b )
> >    return
> >      $nodes => fold-left((), function($all, $this) {$all, $this except
> > $all})
> >
> > Hopefully this is fixed in the next versions of Saxon?
>
> No, it doesn't seem to be fixed, Mike's implementation seems to try be
> smarter than the spec allows and his own coding assumes :)
>
> Saxon-JS 2.3 gets
>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> version="3.0">
>    <xsl:output omit-xml-declaration="yes"/>
>    <xsl:template match="/">
>      <xsl:sequence select=
>        "let $xml := /,
>        $nodes := (/*/a, /*/c, /*/b, /*/a, /*/b, /*/a, /*/c, /*/b, /*/a,
> /*/b,
>        /*/a, /*/c, /*/b, /*/a, /*/b, /*/a, /*/c, /*/b, /*/a, /*/b,
>        /*/a, /*/c, /*/b, /*/a, /*/b, /*/a, /*/c, /*/b, /*/a, /*/b,
>        /*/a, /*/c, /*/b, /*/a, /*/b, /*/a, /*/c, /*/b, /*/a, /*/b,
>        /*/a, /*/c, /*/b, /*/a, /*/b )
>        return
>          fold-left($nodes, (), function($all, $this) {$all, $this except
> $all})"/>
>    </xsl:template>
> </xsl:stylesheet>
>
> right but SaxonCS and Saxon HE 10.6 don't.
> 
>
>

-- 
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
To achieve the impossible dream, try going to sleep.
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they write
all patents, too? :)
-------------------------------------
Sanity is madness put to good use.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

Current Thread