Используйте это выражение XPath 2.0 :
not($requirements[not(name()=$offer/name())])
, где :
$requirements
равно /*/requirements/*
и
$offer
- это /*/offer/*
, и они сравниваются с XML-документом ниже (по сути, предоставленный плохо сформированный XMLсделал правильно сформированный документ XML):
<t>
<requirements>
<bar/>
<restaurant/>
</requirements>
<offer>
<baz/>
<beach/>
<restaurant/>
<nightclub/>
</offer>
</t>
Тот же метод для вашей первоначальной задачи:
not(/*/one/a[not(@a = /*/two/a/@a)])
Обратите внимание, что выше-lener XPath 1.0 решение .:)