How to find elements by attribute namespace in XPath

39,678

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?

Share:
39,678
Gareth
Author by

Gareth

I'm just a web developer with a few ideas.

Updated on February 04, 2020

Comments

  • Gareth
    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 and doodah 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
    Johannes Weiss about 15 years
    does not match attrubutes in that namespace
  • Dimitre Novatchev
    Dimitre Novatchev about 15 years
    Not 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
    Dimitre Novatchev about 15 years
    You 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
    Gareth about 15 years
    It 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
    Emmanuel Rodriguez about 15 years
    Thanks 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
    Spring over 12 years
    @Dimitre Novatchev could you pls have a look here is this a namespace problem? tnx stackoverflow.com/questions/7007767/…