Select Element in a Namespace with XPath

namespaces, xml, xpath

Solution

In XPath 2.0 and XQuery 1.0 you can test against the namespace prefix using the in-scope-prefixes() function in a predicate. e.g.

//*[in-scope-prefixes(.)='html']

If you cant use v2, in XPath 1.0 you can use the namespace-uri() function to test against the namespace itself. e.g.

//*[namespace-uri()='http://www.w3c.org/1999/xhtml']

Problem

I want to select the topmost element in a document that has a given namespace (prefix). More specifically: I have XML documents that either start with /html/body (in the XHTML namespace) or with one of several elements in a particular namespace. I effectively want to strip out /html/body and just return the body contents OR the entire root namespaced element.

Original source