All great answers! But the question deserves refinement ...
I've got the following sample XML ...
<objects>
<object objectId="1123" ... />
<properties refObjectId="1123" ... />
<properties refObjectId="1123" refPropertyId="2311" ... />
<properties refObjectId="1123" refPropertyId="4611" ... />
<object objectId="2123" ... />
<properties refObjectId="2123" refPropertyId="4311" ... />
<properties refObjectId="2123" refPropertyId="8611" ... />
....
</objects>
... and the following XPath query ...
//object[//properties[@refObjectId=@objectId and not(@refPropertyId)]]
I thought this query would return all object
nodes where there is a properties
node that has a refObjectId
attribute that equals the objectId
attribute of the object
node and no 'refPropertyId' attribute ... namely object 1123 only, not object 2123 ... but it doesn't. It seems the @objectId
in the nested predicate does not refer to the objectId
attribute of the object
node.
Any ideas? I know the XML structure isn't nested as you would expect, but there are reasons for this structure.
Generally you should avoid using //
where you can. I'd consider rephrasing:
//object[../properties/@refObjectId=@objectId]
In the expression provided, your nested predicate is actually checking for
//properties/@refObjectId=//properties/@objectId
of which there are none.
I hope this helps!
EDIT: Since the question has been updated here is an updated response: You added "It seems the @objectId in the nested predicate does not refer to the objectId attribute of the object node." You're absolutely right! So let's fix it!!
//object[../properties[not(@refPropertyId)]/@refObjectId=@objectId]
This should be closer to what you're after!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With