[xsl] Re: Getting a distinct list of node names

Subject: [xsl] Re: Getting a distinct list of node names
From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx>
Date: Wed, 17 Dec 2003 07:08:43 +0100
"David Tolpin" <dvd@xxxxxxxxxxxxxx> wrote in message
> > > > 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
> >
> > 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)


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


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

Current Thread