我有以下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
为什么会这样?
答案 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>