2010-01-04 31 views
3

我有以下類型的HTML。內容按<div "id=foo"><div "id=foo1">元素分組,中間爲<div "style=padding…">XPath只能直接跟隨兄弟姐妹

我試圖找出如何制定一個XPath表達式,讓我來觸發關閉"id=foo""style=padding…"

獲取<div id="foo">是微不足道的回報兄弟<div>秒。但是,我不能只根據"style=padding…"執行following-sibling,因爲它會返回所有匹配的<div>

我需要一種方法來返回匹配<div> s,直到我碰到與"id=foo1"匹配的兄弟。我很確定有一個簡單的方法,我錯過了!

<div id="foo">stuff...</div> 

<div style="padding:2px; ">stuff...</div> 

<div id="foo1">stuff...</div> 

<div id="foo">stuff...</div> 

<div style="padding:2px; ">stuff...</div> 
<div style="padding:2px; ">stuff...</div> 
<div style="padding:2px; ">stuff...</div> 

<div id="foo1">stuff...</div> 
+0

您應該能夠構造一個基於「之前的兄弟」軸的謂詞,並將其應用於使用「跟隨兄弟」軸檢索的節點集。但是,我不想嘗試調試/維護該查詢。 – kdgregory 2010-01-04 16:24:40

+0

如果你在談論xhtml,是否有多個元素具有相同的id? (ID = 「foo」 的)。 – Cheeso 2010-01-05 19:15:53

回答

5

有沒有理由不採取簡單的方法來挑選所有沒有id屬性的div

div[not(@id)] 

或者,或許,div s有一個style屬性?

div[@style] 

如果由於某種原因,這是不能接受的,你可以用的東西去更像是自己所想:

div[@style][following-sibling::div[@id='foo1']] 

它可以獲取所有div S的樣式屬性div之前哪來s匹配一個特定的id。這是你要求的嗎?

我想你的實際輸入HTML不如你提供的例子微不足道,但是我列出的所有這些XPath表達式都適用於你的例子。如果您可以提供有關您的預期產出和您遇到的問題的更具體細節,那麼我可以爲您提供更多幫助。

-3

給他們一個類名,而不是使用內嵌樣式

0

我不認爲這種使用XPath查詢是可行的。它會要求你記住所選div的索引(不那麼難),但是然後比較它的兄弟姐妹的索引和它後面的第一個#foo1 div。如果可能的話,這是一個非常複雜的XPath查詢。 XPath不容易讓你保留多個作用域來比較元素或屬性。

您最好先選擇兩個分隔符div,然後匹配兩者之間的分隔符。這在代碼中很容易,然後在XPath中執行。

如果你確實需要在XPath中做到這一點,你希望定界符div有不同的ID(首先,具有相同ID的多個元素無論如何都是無效的,所以使用不同的ID或類名),以及然後以某種方式匹配帶有填充的div上的id或class名稱。換句話說,更改HTML以提供足夠的參考,而不是嘗試在XPath中完全解決它。

-2

你最好的長期賭注是修復HTML。任何其他解決方案都很脆弱。

1

一個不那麼好看的做你似乎什麼打算將如下的方式(請注意,它是基於你真的有多個<div> s的相同id的假設!):

/*/div[@id='foo'][n]/following-sibling::div[@style='padding…'] 
[ 
    count(preceding-sibling::div[@id='foo']) 
    = 
    count(/*/div[@id='foo'][n]/preceding-sibling::div[@id='foo']) + 1 
] 

XPath表達式的第一行採取任何<div style="padding…">是第n個<div id="foo">的下面兄弟(這是儘可能你有你自己的,選擇所有的人都)。

然後它計算每個人的前兄弟<div id="foo">,並且只匹配那些在這裏具有正確號碼的人,例如,多一個<div id="foo">比各自<div id="foo">本身有。改變數字n以選擇另一組。

如果您輸入的內容,其實具有相同ID的多個元素,它就會簡單很多:

//div[@style='padding…'][preceding-sibling::div[@id][1]/@id = 'foo'] 

這將選擇那些<div style="padding…">其中第1跟前<div>(即有id )的ID值爲'foo'。如上所述,這意味着只有一個<div>,其ID爲'foo',並且其他前面的<div> s是而不是具有ID。