nokogiri xpath属性 – 奇怪的结果

我有一堆字段,当我尝试运行时:

src.xpath('//RECORD').each do |record| tbegin = record.xpath('//FIELD/TOKEN') 

tbegin数组返回其他记录中的字段。 我已经检查过第一行是否给了我适当的“记录”子树数组,但下一次调用tbegin并不tbegin搜索限制为仅仅“记录”子树。 实际上,它始终返回record[0]的字段子树。

到目前为止,我通过使用以下方式解决了这个问题:

 tbegin = record.css('TOKEN') 

但我想知道我做错了什么。

问题是xpath('//FIELD/TOKEN')的前导双斜杠,它告诉nokogiri匹配与此节点无关的节点,但不管位置如何都匹配整个文档。 要匹配相对于节点本身,您必须删除双斜杠:

 tbegin = record.xpath('FIELD//TOKEN') 

作为补充说明, tbegin = record.css('TOKEN')工作的原因是record是提供搜索开始的顶级节点。 'TOKEN'不会强制搜索文档的根目录,这与//FIELD/TOKEN ,后者会这样做。