"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