更新:更簡單的解決
。在你的情況的一個先決條件,那就是錨項目始終是第一個前置兄弟具有一定的財產。正因爲如此,這裏的寫作以下複雜表達式的一個更簡單的方法:
/div/dl/dd[preceding-sibling::dt[1][. = 'Names']]
換句話說:
- 選擇任何
dd
- 具有第一前置兄弟
dt
(前面的兄弟軸向後計數)
- 其本身具有「名稱」的值
從oXygen的以下屏幕截圖可以看出,它選擇您想要選擇的節點(如果將「名稱」更改爲「狀態」或「另一個字段」,它將在下一個dt
之前選擇僅以下幾個節點也)。
原本複雜的解決方案(留下供參考)
這是XPath 2.0中更容易,但是讓我們假設你只能使用XPath 1.0。訣竅在於計算來自錨元素(其中包含「名稱」的元素)中前一個兄弟元素的數量,並忽略任何錯誤數量的元素(即,當我們跨過<dt>Status</dt>
時,前面的兄弟元素數量增加) 。
對於XPath 1.0中,除去(:
和:)
之間的意見(XPath中,空白是無關緊要的,你可以把它的可讀性多的XPath,但在1.0,評論是不可能的)
/div/dl/dd
(: any dd having a dt before it with "Names" :)
[preceding-sibling::dt[. = 'Names']]
(: count the preceding siblings up to dt with "Names", add one to include 'self' :)
[count(preceding-sibling::dt[. = 'Names']/preceding-sibling::dt) + 1
=
(: compare with count of all preceding siblings :)
count(preceding-sibling::dt)]
由於一行:
/div/dl/dd[preceding-sibling::dt[. = 'Names']][count(preceding-sibling::dt[. = 'Names']/preceding-sibling::dt) + 1 = count(preceding-sibling::dt)]
感謝您的解釋。試圖瞭解它:) –
@安德烈,很高興我能有一定的幫助! :) – Abel