使用带有php的xpath选择所有href属性和选择具有href属性的所有锚元素之间的差异

时间:2011-04-24 18:39:56

标签: php xpath href

鉴于在html文档中,所有锚元素都具有设置的href属性:

以下xpath查询之间有什么区别

案例1:

//@href

案例2:

//a/@href

案例3:

*/a/@href

在我的情况下:

//@href返回href属性中包含的所有数据。

//a/@href只返回任何内容,但我希望它返回与//@href

相同的内容

*/a/@href只返回任何内容,但我希望它返回与//@href//a/@href

相同的内容

我担心我非常误解这些查询是如何工作的。有没有人可以帮我。提前感谢您的帮助。

3 个答案:

答案 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。