Re: [xsl] Getting Unexpected Results from .//* = $set-of-elements

Subject: Re: [xsl] Getting Unexpected Results from .//* = $set-of-elements
From: "Eliot Kimber ekimber@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 24 Feb 2018 21:41:19 -0000
I updated my code to use exists(. intersect
$elements-to-keep/ancestor-or-self::*) and that definitely works and I like
having a singleton on one side, but even my largest input document would not
be large enough to show a significant performance benefit.

Cheers,

Eliot
--
Eliot Kimber
http://contrext.com

o;?On 2/24/18, 2:37 PM, "Michael Kay mike@xxxxxxxxxxxx"
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

    Your requirement is

    IF any descendant of current element is in $elements-to-keep, process the
current element

    and I suggested

    > select="exists(.//* intersect $elements-to-keep)"

    But I suspect the following would be better:

    > select="exists(. intersect $elements-to-keep/ancestor-or-self::*)"

    (That is, "if the current element is an ancestor-or-self of any element in
$elements-to-keep)

    Enumerating the ancestors of an element is likely to be faster than
enumerating its descendants. Saxon also has a faster implementation of
"intersect" for use when one operand is a singleton.

    But if you want to return false when "." is in $elements-to-keep (but none
of its descendants is) then you may need to tweak this slightly


    Michael Kay
    Saxonica

    > On 24 Feb 2018, at 20:17, Eliot Kimber ekimber@xxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
    >
    > So my misunderstanding of "=" is that it is comparing values, not
nodes--I clearly never understood that properly.
    >
    > That then explains why an empty element would produce the results I was
seeing: "" is equal to any other empty node.
    >
    > Doh!
    >
    > I will try Mike's intersection expression.
    >
    > Cheers
    >
    > W.
    >
    > --
    > Eliot Kimber
    > http://contrext.com
    >
    > o;?On 2/23/18, 6:39 PM, "Michael Kay mike@xxxxxxxxxxxx"
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
    >
    >
    >> On 24 Feb 2018, at 00:18, G. Ken Holman g.ken.holman@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
    >>
    >> Ignore that second expression ... I wrote it too hastily and I'm now
back at my desk to think about it.
    >>
    >> This would work I think:
    >>
    >> <xsl:value-of select="some $this in .//* satisfies
    >>                       some $that in $elements-to-keep
    >>                       satisfies $this is $that"/>
    >>
    >
    >    I think that's equivalent to saying that the intersection of the two
sets is non empty:
    >
    >    select="exists(.//* intersect $elements-to-keep)"
    >
    >    Michael Kay
    >    Saxonica

Current Thread