XPath:选择具有显式“xmlns”属性的节点

时间:2012-01-27 16:07:42

标签: xpath

任何人都可以提供XPath表达式,它选择所有具有明确'xmlns'属性的节点,例如: <html xmlns="http://www.w3.org/1999/xhtml">//*[@xmlns]不起作用,因为(事实证明)XPath不会将xmlns视为属性。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<title>Информация по счетам, картам</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="pragma" content="no-cache"/>
.......

我这里只需要'html'节点。

2 个答案:

答案 0 :(得分:9)

技术上正确的答案是它......

不可能。您需要区分源文本所代表的抽象文档和实际源文本本身。 XPath对抽象进行操作,而不是对源文本进行操作,xmlns伪属性的 location 仅与后者相关。

...然而

您可以使用以下XPath 2.0表达式来伪装

//*[not(namespace-uri()=ancestor::*/namespace-uri())]

这将选择在同一名称空间中没有祖先的任何元素,理论上这意味着它选择声明名称空间的所有元素。但是,它不会捕获重新声明的名称空间。例如,请考虑以下文档:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head/>
    <body>
        <p xmlns="http://something">
            <p xmlns="http://something"/>
        </p>
    </body>
</html>

上面的表达式选择html元素和第一个p。第二个p在同一名称空间中有一个祖先,因此它未被选中,即使它指定了xmlns

答案 1 :(得分:3)

这不可能,因为

<a xmlns="http://www.org/1"> <b/> </a>

相当于

<a xmlns="http://www.org/1"> <b xmlns="http://www.org/1"/> </a>