为什么XPathselect上下文节点之外的节点?

我正在使用带有Node.js的XPath,并且我有下面的HTML文档,我想在其中select所有文章节点,然后在第二步中使用类"abc"所有div:

 <html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <article> <div>123456</div> <div class="abc">Hello0!</div> </article> <article> <div>123456</div> <div class="abc">Hello1!</div> </article> <article> <div>123456</div> <div class="abc">Hello2!</div> </article> <article> <div>123456</div> <div class="abc">Hello3!</div> </article> <article> <div>123456</div> <div class="abc">Hello4!</div> </article> <article> <div>123456</div> <div class="abc">Hello5!</div> </article> <article> <div>123456</div> <div class="abc">Hello6!</div> </article> <article> <div>123456</div> <div class="abc">Hello7!</div> </article> <article> <div>123456</div> <div class="abc">Hello8!</div> </article> <article> <div>123456</div> <div class="abc">Hello9!</div> </article> </body> </html> 

我用下面的代码来select节点:

 var xpath = require('xpath'); var DOMParser = require('xmldom').DOMParser; let parser: DOMParser = new DOMParser(); let doc = parser.parseFromString("HTML-document","text/xml"); let nodes: Node[] = xpath.select("//article", doc); console.log("NODES: ", nodes.length); let divs: Node[] = xpath.select("//div[@class='abc']", nodes[0]); console.log("DIVS: ", divs.length); 

我的问题是,当检查两个控制台日志时,第一个说"NODES: 10"

到目前为止,我有十个文章节点。 但是,当我在十个文章节点中的第一个节点上再次select时,控制台显示"DIVS: 10" 。 所以XPath从一篇文章中select了所有的10个div,我预计只有一个div

我究竟做错了什么?

Andersson已经为您的问题 (+1)提供了正确的直接答案 ,但这里只是另一种select:您可以将两个XPath合并为一个:此XPath,

 //article[0]/div[@class='abc'] 

将select相同的div元素作为你的两个步骤的过程。

你甚至可以在path的任何一步更精细。 这个XPath将使用一个div值为123456div子元素在article元素中select@class='abc'div元素:

 //article[div='123456']/div[@class='abc'] 

对于显示的特定XML文档, article谓词select所有articles ,但这种细化的可能性一般存在。

你应该注意//表示从页面元素开始的任何地方search,而.//表示从当前节点开始search页面的任何地方。 所以,如果你想从已经find的article元素开始search,你需要更换

 "//div[@class='abc']" 

 ".//div[@class='abc']" 

要么

 "./div[@class='abc']" 

因为divarticle的直接子