How to find elements by attribute namespace in XPath
Solution 1
Use:
//*[namespace-uri()='yourNamespaceURI-here'
or
@*[namespace-uri()='yourNamespaceURI-here']
]
the predicate two conditions are or-ed with the XPath or
operator.
The XPath expression thus selects any element that either:
- belongs to the specified namespace.
- has attributes that belong to the specified namespace.
Solution 2
I'm not sure if this is what you mean, but by only deleting one char in your XPath you get all elements in a certain namespace:
//*[namespace-uri()='http://foo.example.com']
Solution 3
You could try
//*[namespace-uri()='http://foo.example.com' or @*[namespace-uri()='http://foo.example.com']]
It will give you element foo:bar and element doodah (if you change tal:quux
to foo:quux
in your XML-data):
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com" xmlns:tal="xxx">
<foo:bar quux="value">Content</foo:bar>
<widget>Content</widget>
<doodah foo:quux="value">Content</doodah>
</root>
Is that what you want?
Comments
-
Gareth about 4 years
I'm trying to use XPath to find all elements that have an element in a given namespace.
For example, in the following document I want to find the
foo:bar
anddoodah
elements:<?xml version="1.0" encoding="UTF-8"?> <root xmlns:foo="http://foo.example.com"> <foo:bar quux="value">Content</foo:bar> <widget>Content</widget> <doodah foo:quux="value">Content</doodah> </root>
I know I can use the following XPath expression to load all attributes from a given namespace:
"//@*[namespace-uri()='http://foo.example.com']"
However:
- This doesn't give me the elements, just the attributes.
- Where elements contain multiple attributes from that namespace, this selector will return a result per-attribute rather than per-element
Is it possible to get what I want, or do I have to gather the attributes and calculate the unique set of elements they correspond to?
-
Johannes Weiss about 15 yearsdoes not match attrubutes in that namespace
-
Dimitre Novatchev about 15 yearsNot quite so... namespace-uri(./@*)='foo.example.com'] returns true only if the first attribute (which is implementation dependent!) belongs to that namespace. The original post wants the element to be selected if any of its attributes belongs to the namespace
-
Dimitre Novatchev about 15 yearsYou haven't understood the question. The OP wants any element to be selected, that either belongs to the namespace or has ot least one attribute that belongs to the namespace. Your expression doesnt select an element that has attributes in the namespace but the element doesnt belong to the namespace
-
Gareth about 15 yearsIt was only the second half of that I needed :) I didn't know you could nest predicates in predicates. Have updated my post accordingly
-
Emmanuel Rodriguez about 15 yearsThanks for the clarification. I know that I haven't understood the question as I added a comment to the question asking why "doodah" should be selected.
-
Spring over 12 years@Dimitre Novatchev could you pls have a look here is this a namespace problem? tnx stackoverflow.com/questions/7007767/…