xsl-list
[Top] [All Lists]

RE: XPath: selecting matching nodes in two node-sets

2003-10-20 09:58:09
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(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Richard Lewis
Sent: 20 October 2003 11:33
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
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