2011-01-24 65 views
3

我有以下的html:// span [2]爲什麼不選擇文檔中的第二個跨度?

<!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 

爲什麼會發生這種情況?

回答

6

[2]具有更高的優先級爲//。您應該讀取原始xpath查詢,如下所示:

//(span[2]) 

這意味着,它在文檔中查找處於同一父元素的第二個span元素的處處。

如果您編寫(//span)[2]而不是它,它會在任何地方查找跨度元素,然後選擇第二個跨度。

2

因爲//span[1]引用了跨度父級的第一個跨度元素。實際上有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> 
+0

至於修復,這在SQL Server XPath中工作,不確定關於JS XPath:`(// span [1])[2]` – RichardTheKiwi 2011-01-24 09:51:50

+0

非常感謝。我已經接受了埃利安的答案,因爲它略微更清楚。這個例子雖然很有用。 – 2011-01-24 10:11:23

相關問題