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

Subject: Re: [xsl] Getting Unexpected Results from .//* = $set-of-elements
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 24 Feb 2018 20:37:14 -0000
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