鉴于在html文档中,所有锚元素都具有设置的href属性:
以下xpath查询之间有什么区别
案例1:
//@href
案例2:
//a/@href
案例3:
*/a/@href
在我的情况下:
//@href
返回href属性中包含的所有数据。
//a/@href
只返回任何内容,但我希望它返回与//@href
*/a/@href
只返回任何内容,但我希望它返回与//@href
和//a/@href
我担心我非常误解这些查询是如何工作的。有没有人可以帮我。提前感谢您的帮助。
答案 0 :(得分:2)
有什么区别 跟随xpath查询
案例1:
//@href
这将选择XML文档中的所有href
属性节点。
案例2:
//a/@href
这将选择属于任何名称为href
但没有名称空间的元素的所有a
属性。
案例3:
*/a/@href
这将选择属于任何名为href
的元素的所有a
属性,这些元素不在命名空间中,并且是当前(上下文)节点的孙。
很可能你想写:
//*/a/@href
这将选择属于任何名为href
的元素的所有a
属性,这些元素不在命名空间中,其父元素是元素。
在我的情况下:
//@href
返回所有数据 包含在href
属性中。
//a/@href
只返回我 期望它返回相同的//@href
*/a/@href
只返回我 期望它返回相同的//@href
和//a/@href
我担心我非常害怕 误解了这些查询的方式 工作。有没有人可以帮我 直行。提前谢谢你 你的帮助。
一种非常常见的情况是XML文档具有默认命名空间。这很可能是导致问题的原因。在这种情况下,文档中不存在“无命名空间”中的a
元素,并且任何具有a
作为位置步骤的XPath表达式都不会选择任何内容。
除此之外,这三个表达式并不等同。
//@href
和//a/@href
可以选择不同的节点集,如果在文档中除a
之外还有其他元素具有href
属性,或者文档位于默认命名空间中。在最后一种情况下,第二个表达式不会选择任何内容。
//a/@href
和//*/a/@href
a
属性的href
,则可以选择不同的节点集。此顶部元素的href
属性由第一个XPath表达式选择,但未被第二个选择,因为顶部元素的父元素不是元素(它是根节点/
)。
答案 1 :(得分:1)
您尚未显示源文档。但我准备打赌你已经犯了#1 XSLT错误,这是忘记或没有注意到它声明了一个默认命名空间,这意味着一个没有前缀的名称,如// a将不会选择任何元素。
答案 2 :(得分:0)
如果要选择具有属性的节点,请使用以下语法://a[@href]
。我不完全确定为什么其他方法不起作用,因为它原则上是有道理的。我猜是多么的XPath。