RE: [xsl] XPath: selecting matching nodes in two node-sets

Subject: RE: [xsl] XPath: selecting matching nodes in two node-sets
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 20 Oct 2003 17:58:09 +0100
I think what you are looking for is the set of items $i such that every
$k in //keyword/matches equals some $i/matches

In XPath 2.0 that's

//item[every $k in //keyword/matches satisfies 
         some $i in ./matches satisfies
            $k eq $i]

or more simply

//item[every $k in //keyword/matches satisfies $x = ./matches]

There's no universal quantifier ("every") in XPath 1.0, but you can use
the equivalence:

every $a in A satisfies X 
   ==>
not(some $a in A satisfies not(X))

So this becomes

//item[not(//keyword/matches != ./matches)]

Michael Kay  

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Richard Lewis
> Sent: 20 October 2003 11:33
> To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] XPath: selecting matching nodes in two node-sets
> 
> 
> I have the following document:
> 
> <results>
> 	<keywords>
> 		<matches>...</matches>
> 		...
> 	</keywords>
> 	<item>
> 		...various elements...
> 		<matches>...</matches>
> 		<matches>...</matches>
> 		...
> 	</item>
> 	<item>....</item>
> 	...
> </results>
> 
> (where <matches> elements contain the keywords themselves, CDATA).
> 
> and what I need is an XPath expression which selects all the 
> <item>s which 
> have the same set of <matches /> elements as in the <keywords> node.
> (Note: there may be repetition of <matches />s in <item>s but not in 
> <keywords>)
> 
> I've tried:
> "//item[matches = //keywords/matches]"
> but this selects <item>s where not all the 
> '//keywords/matches' elements are 
> present.
> 
> Cheers,
> Richard
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


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


Current Thread