2010-11-01 56 views
4

在包含大量DIV的文檔中,我希望選擇asset-body元素中的文本,但前提是該「條目」的asset-name entry-title中的鏈接包含href值中的文本democrat如何根據XPath中的嵌套同級的值選擇元素?

因此,在下面的例子中,包含兩個「項」(entry-1entry-2),我只是想,說Jackpot!的文本,因爲在「入口」的bookmark鏈接的價值包含子democrat

http://blahblah.com/politics-democrat 

是否可以使用XPath執行此操作?

ENTRY 1:(FAIL:在該條目bookmark鏈路缺少子democrat

<div id="entry-1" class="item-asset asset hentry"> 
    <div class="asset-header"> 
    <h2 class="asset-name entry-title"> 
     <a rel="bookmark" href="http://blahblah.com/paper-scissors">Paper Scissors</a> 
    </h2> 
    </div> 
    <div class="asset-content entry-content"> 
    <div class="asset-body"> 
    <p>Paper and scissors</p> 
    </div> 
    </div> 
</div> 

ENTRY 2:(PASS:在該條目bookmark鏈路包含子democrat

<div id="entry-2" class="item-asset asset hentry"> 
    <div class="asset-header"> 
    <h2 class="asset-name entry-title"> 
     <a rel="bookmark" href="http://blahblah.com/politics-democrat">Pelosi Q&amp;A</a> 
    </h2> 
    </div> 
    <div class="asset-content entry-content"> 
    <div class="asset-body"> 
    <p>Jackpot!</p> 
    </div> 
    </div> 
</div> 
+0

好問題,+1。查看我的答案,獲得一個單行XPath表達式,可以精確選擇所需的文本節點。 :) – 2010-11-01 01:34:28

回答

3
//div[contains(
      div/h2[ 
       contains(concat(' ',@class,' '),' asset-name ') 
       and 
       contains(concat(' ',@class,' '),' entry-title ') 
      ]/a[@rel='bookmark']/@href 
     ,'democrat') 
     ]/div/div[ 
      contains(concat(' ',@class,' '),' asset-body ') 
      ]//text() 
+0

謝謝。這比Dimitre的答案更詳細,但它也包含更多關於dom結構的要求,這可能是件好事。現在必須做一些測試。 – August 2010-11-01 10:20:26

+0

+1適用於'@ class'的正確測試。 – 2010-11-01 12:59:23

+0

@Alejandro:Dimitre的班級考試當然簡單得多:'@ class ='asset-body''。它的簡單性也使它更易於閱讀。雖然也許有必要嗎?我不知道。 – August 2010-11-01 13:10:50

2

使用

//div[@class='item-asset asset hentry' 
    and .//a[contains(@href, 'democrat')] 
    ] 
    /following-sibling::div[@class='asset-body']/p/text() 
+0

非常簡潔。謝謝。這裏點的目的是什麼:'.// a'?這是否意味着錨點必須位於'// div [@ class ='item-asset asset hentry''? – August 2010-11-01 10:08:18

+2

@八月:'.// a'等價於'後代或自己:: a'它表示:選擇所有'a'元素,它們是上下文節點的後代或上下文節點本身,如果它是'一個元素。 @Mads-Hansen在他的回答中更嚴格地遵循你所顯示的XML結構,而我給出了一個更一般的表達式,即使你的例子並不完全代表精確的xml結構,它也會選擇想要的節點。 – 2010-11-01 12:40:09

+0

感謝您的解釋。另外,我注意到你說'@ class ='asset-body'',而Alejandro說'包含(concat('',@ class,''),'asset-body')''。這只是一種風格差異? – August 2010-11-01 13:04:23

1

在文檔中含有大量 數量的DIV,我要選擇asset-body元素, 但裏面的 文本只有當內部 的bookmark鏈接該asset-name entry-title的 「條目」包含文字democrat的 的href值。

//*[contains(concat(' ',@class,' '), 
        ' hentry ')] 
    [.//*[contains(concat(' ',@class,' '), 
         ' asset-name ')] 
     [contains(concat(' ',@class,' '), 
         ' entry-title ')] 
     //a[@rel='bookmark'] 
      [contains(@href,'democrat')]] 
    //*[contains(concat(' ',@class,' '), 
         ' asset-body ')] 
+0

很酷。什麼是'/ * *'?這是否意味着「任何因素」 - 不僅僅是DIV? – August 2010-11-01 12:58:57

+0

@八月:是的。我假設一個非常放鬆的模式,因爲你使用微格式。 – 2010-11-01 13:01:58

+1

@八月HTML'@ class'可以包含任意數量的NMTOKENS(空格分隔值)。對於這些值來說,這是一個更「安全」的匹配,可以避免假陽性的部分詞匹配。 – 2010-11-01 13:22:47