最近我需要在 HTML 文档的节点上评估 XQuery。基本上,我需要从 body 元素的第一个子元素中选择具有 href 属性的所有元素。我添加了一个小例子来解释:
<html>
<body>
<a href="http://www.google.be"/>
</body>
</html>
在这种情况下,所需的提取结果显然是:
<a href="http://www.google.be"/>
我的第一个想法是使用//body/*[1]//*[@href]
,因为:
//body
匹配 body 元素,无论它在哪里/*[1]
匹配 body 元素的第一个子元素//*[@href]
匹配当前元素的所有后代或自身
我认为这可行,但在提供的示例中,XQuery 没有给出任何结果。
但是,我阅读了一下,发现以下内容(来源:http ://www.keller.com/xslt/8/ ):
Alternate notation for "//": descendant-or-self::node()
所以我将我的 XQuery 更改为//body/*[1]/descendant-or-self::node()[@href]
,这一次,结果是正确的。
我的问题://和descendant-or-self::node()有什么区别?我在这里找到的(What's the difference between //node and /descendant::node in xpath?)和这里(http://www.w3.org/TR/xpath/#axes)说:
//
是 的缩写/descendant-or-self::node()/
。例如,//para
是 的缩写/descendant-or-self::node()/child::para
。
这使我得出结论//
并且/descendant-or-self::node()
不可互换(可能是因为最后终止/
了?),但是有人可以告诉我是否有简写/descendant-or-self::node()
吗?