2013-10-01 12 views
5

Mam strukturę HTML, którą próbuję przetestować przy użyciu XPATH. Struktura będę patrząc na obecnie jest coś takiego:Uzyskaj węzeł nadrzędny z wartości potomnej XPATH

<div id="item_1" class="item-wrapper"> 
    <div class="container item"> 

     <div class="container-header"> 
      <h2 id="title">test-title</h2> 
      <h5 id="description">test-description</h5> 
     </div> 

    </div> 
</div> 

Istnieje wiele „rzeczy” w moim dokumencie, każdy z unikalnym identyfikatorem. Używając XPATH, chcę "dostać" węzeł item_1 z wartości węzła id title ("test-title" w tym przypadku).

Chcę również zrobić to w sposób, który nie jest zależny od znacznika węzła (div/h2/etc).

Grałem z predykatami, ale nie mogę znaleźć rozwiązania, które działa. Na przykład:

//*[@class="item-wrapper"][./*[@id="title"][text()="test-title"]] 

Dzięki za pomoc!

Odpowiedz

9

Można użyć poniższego XPATH:

//*[@id="title"]/ancestor::*[@id="item_1"][1] 

Albo, można również użyć funkcji Function: node-set id(object)

id('title')//ancestor::*[@id="item_1"][1] 

Aktualizacja

//*[.="test-title"]/ancestor::*[@class="item-wrapper"][1] 

wyjście

<div id="item_1" class="item-wrapper"> 
    <div class="container item"> 

     <div class="container-header"> 
      <h2 id="title">test-title</h2> 
      <h5 id="description">test-description</h5> 
     </div> 

    </div> 
</div> 
+0

Właściwie szukam to zrobić bez odniesienia do identyfikatora bezpośrednio, ponieważ są one generowane automatycznie i niepowtarzalny. Chciałem również, aby wyszukiwanie odbywało się według wartości tekstowej "title", jak wspomniano powyżej. Twoja odpowiedź wskazała mi jednak właściwy kierunek, "/ ancestor :: *" był tym, czego mi brakowało. FYI, odpowiedzią na mój problem było: '// * [@ id =" title "] [text() =" test-title "]/ancestor :: * [@ class =" item-wrapper "]' – olan

+0

@ zobacz moją aktualizację! :) –

Powiązane problemy