xsl-list
[Top] [All Lists]

Re: Getting a distinct list of node names

2003-12-16 23:08:43

"David Tolpin" <dvd(_at_)davidashen(_dot_)net> wrote in message
news:200312162015(_dot_)hBGKFqkZ014006(_at_)adat(_dot_)davidashen(_dot_)net(_dot_)(_dot_)(_dot_)
node:definition/*[not(name() = name(preceding-sibling::*))]

Why should this take a long time?  Isn't this the same as

*[not(name() = name(preceding-sibling::*[last()]))]

preceding-sibling::*[last()]), which therefore won't de-duplicate
properly.

So it won't take a long time, and it won't work either.

But is there a way to express it as a single predicate? I mean, not equal
to the name
of any preceding-sibling? Just out of curiousity.

Yes, either by using keys (e.g. the Muenchian method) or after sorting the
node-set then the comparison must be for inequality of the names of the
current node and its immediate preceding sibling:

   not(name() = name(preceding-sibling::*[1]))


In case the node-set is not sorted and keys are not used, this cannot be
expressed in a single XPath expression.

If we had to compare just the values and not the names, then the single
XPath expression is:

   not(. = preceding-sibling::*)


but finding all elements with non-duplicate content in this way takes O(N^2)



=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL

Resume:
http://fxsl.sourceforge.net/DNovatchev/Resume/Res.html




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list