2010-09-16 76 views
0

我有以下HTML片段http://paste.enzotools.org/show/1209/,我想提取具有值爲「172.80」(它是該片段的第四個節點)的文本()後裔的標記。我迄今爲止的嘗試一直是:XPath表達式問題

'descendant::td[@class="roomPrice figure" and contains(descendant::text(), "172.80")]' 
'descendant::td[@class="roomPrice figure" and contains(div/text(), "172.80")]' 
'descendant::td[@class="roomPrice figure" and div[contains(text(), "172.80")]]' 

但他們都沒有選擇任何東西。 有沒有人有任何建議?

+0

臨屋的HTML片段不是有效的XML/HTML - 有'是開頭title'屬性' Oded 2010-09-16 13:48:36

+0

請修復您的代碼。我收到錯誤:「錯誤:引用未聲明的實體'nbsp'」 – Topera 2010-09-16 13:49:47

+0

您使用什麼來應用這些XPath查詢? jQuery的?硒?它很重要。 – LarsH 2010-09-16 14:20:31

回答

1

當將節點集合傳遞給函數調用時,請注意如果函數簽名沒有聲明節點集合參數,那麼它會從該節點集合中轉換出第一個節點。

所以,我認爲你需要這個XPath表達式:

descendant::td[@class="roomPrice figure"][div[text()[contains(.,'172.80')]]] 

試驗div

descendant::td[@class="roomPrice figure"] 
       [div[descendant::text()[contains(.,'172.80')]]] 

測試,對於文本節點後代文本節點孩子div

descendant::td[@class="roomPrice figure"] 
       [descendant::text()[contains(.,'172.80')]] 

試驗的td

+0

+1擊敗了我。 :-)(請注意'descendat'中的錯字。) – LarsH 2010-09-16 14:30:29

+0

@LarsH:感謝您的注意。現在它是正確的。 – 2010-09-16 14:48:51

+0

謝謝。你的解決方案有效 – elbear 2010-09-16 15:25:08

0

文本節點descendat我相信你想是這樣的:

<xsl:for-each select="//td[contains(string(.), '172.80')]"> 

字符串()函數會給你所有的當前節點和後代節點中的文本wherease text()只是爲您提供當前(上下文)節點中的文本。

當然,你擴展的XPath選擇器來過濾在類名太...

<xsl:for-each select="//td[contains(string(.), '172.80')][@class='roomPrice figure']"> 

而且在上面的評論說,你發佈的XML/HTML是無效的,因爲它的立場。

+0

這是一種方法。請注意,顯式的'string(。)'是多餘的,因爲第一個參數會隱式轉換爲字符串。唯一的缺點是每個td都可以用這種方式轉換爲字符串,這將涉及到大量不必要的字符串連接來構建將被丟棄的字符串。但這對於小型網頁可能不是問題。 – LarsH 2010-09-16 14:34:04

0

我的理解是,您要在指定的類中選擇td元素,該元素具有包含值「172.80」的後代文本節點。

我假設上下文節點是<tr>(或它的某個祖先)。

您列出的所有嘗試均遭受僅將節點集的第一個節點轉換爲單個字符串的問題。因此,如果tddiv在包含「172.80」的節點之前有後代或子節點文本節點,則包含「172.80」的節點將不會被注意到。

試試這個:

'descendant::td[@class="roomPrice figure" and 
       descendant::text()[contains(., "172.80")]]' 
+0

也謝謝。您的解決方案也適用。 – elbear 2010-09-16 15:26:42

+0

@LucianU:不客氣。你應該提高你認爲有幫助的答案,並接受其中的一個答案。 – LarsH 2010-09-16 15:28:27

+0

LarsH,我嘗試了upvoting,但我沒有足夠的聲譽。順便說一句,也謝謝你解釋清楚的問題。我現在明白什麼是錯的,希望不會重複這個錯誤。 – elbear 2010-09-16 15:51:18