2016-10-23 8 views
3

У меня есть HTML файл выглядит следующим образом:XPath для всех дочерних элементов до определенного брата?

<r> 
    <ab id = "1"> 
    <event/> 
    <li>a</li> 
    <li>b</li> 
    <action/> 
    <li>a2</li> 
    <li>b2</li> 
    <action/> 
    </ab> 
    <ab id = "2"> 
    <event/> 
    <li>a3</li> 
    <li>b3</li> 
    <action/> 
    </ab> 
</r> 

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

<li>a</li> 
<li>b</li> 

А для второго узла события, результат должен быть

<li>a3</li> 
<li>b3</li> 

Для первого шага, я использовал

/r/ab/event 

и получить желаемый результат, однако, я застрял и запутался на втором этапе, я попытался использовать

following-sibling::*[following-sibling::action[1]] 

Это дает мне результат

<li>a</li> 
<li>b</li> 
<action/> 
<li>a2</li> 
<li>b2</li> 

для первого узла событий, и результат

<li>a3</li> 
<li>b3</li> 

для второго узла событий.

Любая идея, как решить эту проблему? Кроме того, я предполагаю, что я могу злоупотреблять следующим братом внутри предикатов, я просмотрел документацию, https://www.w3.org/TR/xpath, но не совсем понял, как его использовать, может кто-нибудь помочь объяснить немного?

ответ

0

Это XPath

/r/ab/event/following-sibling::li[not(preceding-sibling::action)] 

подберет все li элементов, которые следуют event элементов и не имеют предшествующую action элемента родственных,

<li>a</li> 
<li>b</li> 
<li>a3</li> 
<li>b3</li> 

по запросу.

+0

Это работает. Большое спасибо! – Cirrus

+0

Вы знаете, почему это – Cirrus

+0

Я учусь, как удалить комментарий, пожалуйста, игнорируя комментарий «вы знаете, почему это». – Cirrus

Смежные вопросы