[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] [Summary] Three ways to express in XPath that there are no duplicates in a list of items


Subject: Re: [xsl] [Summary] Three ways to express in XPath that there are no duplicates in a list of items
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Fri, 02 Nov 2012 13:30:54 +0000

On 02/11/2012 13:01, Dimitre Novatchev wrote:
count(Websites/*) = count(distinct-values(Websites/*))
A more efficient version (for an XPath processor with weak optimizer)
of this is:

not(Websites/*[count(distinct-values(Websites/*))+1])

So, we only count up to:
      count(distinct-values(Websites/*))+1

and don't need to count all children of Websites and then compare them
to the count of distinct values.
That solution is wrong because the context for child::Websites is different inside the predicate.

In some circumstances it would work in the form

not(//Websites/*[count(distinct-values(//Websites/*))+1])


But that solution is more dependent on a smart optimizer than the original, because a naive engine will reevaluate the predicate once for every node selected; and the performance of an unoptimized implementation of the original is still (almost) linear, whereas an unoptimized implementation of the latter is quadratic.


Michael Kay
Saxonica


Current Thread
Keywords