Xpath получение элементов из плоской иерархии HTML

#php #xpath

#php #xpath

Вопрос:

Структура HTML:

 <div class="title">
    <h1>Some title</h1>
</div>    
<div class="row">something</div>

... (repeats the same structure)

<div class="title">
    <h1>Another title</h1>
</div>    
<div class="row anotherclass">1 something</div>
<div class="row">2 something</div>
<div class="row">3 something</div>

<div class="title">
    <h1>Some title</h1>
</div>    
<div class="row">something</div>
  

Как я могу получить все разделы (с классом «row»), где предыдущий заголовок (h1) соответствует моему $search ?

То, что у меня есть прямо сейчас (не работает для последнего элемента, а также не останавливается на следующем заголовке):

 //div[child::h1[contains(text(), "<?php echo $search ?>")]]
/following-sibling::div[contains(concat(" ", normalize-space(@class), " "), " title ")]
/preceding-sibling::div[contains(concat(" ", normalize-space(@class), " "), " row ")]
  

Если я ищу «Другое название», результат должен быть:

 <div class="row anotherclass">1 something</div>
<div class="row">2 something</div>
<div class="row">3 something</div>
  

Ответ №1:

Это длинный:

 //div[contains(concat(" ",@class," ")," row ")][preceding-sibling::div[contains(concat(" ",@class," ")," title ")][1][contains(h1,"<?php echo $search ?>")]]
  

Я разобью его на части:

Вам нужны все divs, у которых есть строка класса…

 //div[contains(concat(" ",@class," ")," row ")]
  

чей первый предшествующий брат с названием класса…

 [preceding-sibling::div[contains(concat(" ",@class," ")," title ")][1]
  

имеет h1, который содержит ваш поисковый запрос

 [contains(h1,"<?php echo $search ?>")]]