为什么// span [2]没有选择文档中的第二个跨度?

时间:2011-01-24 09:46:37

标签: javascript html xpath

我有以下html:

<!doctype HTML>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Test</title>
</head>
<body>

<p>A <span>one</span></p>

<p>B <span>two</span></p>

<p>C <span>three</span></p>

<p>D <span>four</span></p>

</body>
</html>

运行XPath //span[1]获得第一个跨度。但是//span[2]返回null:

 input: document.evaluate("//span[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
output: <span>​one​</span>​

 input: document.evaluate("//span[2]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
output: null

为什么会这样?

2 个答案:

答案 0 :(得分:6)

[2]的优先级高于//。您应该将原始xpath查询读作:

//(span[2])

这意味着它在文档中的任何位置都可以查找同一父元素的第二个span元素。

如果您改为编写(//span)[2],它将在任何地方查找span元素,然后选择第二个范围。

答案 1 :(得分:2)

因为//span[1]引用了span的父级的第一个span元素。实际上有4个符合这个标准(全部4个)。您只能看到使用.singleNodeValue

的一个

//span[2]要求跨越父母的第二个孩子。

尝试使用此主体查看

<body>
<p>A <span>one</span></p>
<p>B <span>two</span></p>
<p>C <span>three</span></p>
<p>D <span>four</span><span>five</span></p>
</body>