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