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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Getting Unexpected Result, Michael Kay mike@xxx | Thread | [xsl] [ANN] Markup Vocabulary Ecosy, Tommie Usdin btusdin |
Re: [xsl] Getting Unexpected Result, Michael Kay mike@xxx | Date | [xsl] [ANN] Markup Vocabulary Ecosy, Tommie Usdin btusdin |
Month |