xpath выберите следующий узел определенного узла - PullRequest
3 голосов
/ 13 декабря 2011

на основе этого HTML:

< table width='300' ......>
 <tbody>
  < tr>
   < td class = 'wcheader1'> ..... </td>
  < /tr>
  < tr>
   < td class = 'wccontnetbox'>......< /td>
  < /tr>
  < tr>
   < td class = 'wccontnetbox'>......< /td>
  < /tr>
  < tr>
   < td class = 'wcheader1'> ..... </td>
  < /tr>
  < tr>
   < td class = 'wccontnetbox'>......< /td>
  < /tr>
  < tr>
   < td class = 'wccontnetbox'>......< /td>
  < /tr>
  < tr>
   < td class = 'wcheader1'> ..... </td>
  < /tr>
  < tr>
   < td class = 'wccontnetbox'>......< /td>
  < /tr>
  < tr>
   < td class = 'wccontnetbox'>......< /td>
  < /tr>
 </tbody>
</table>

У меня проблемы с выбором только первых двух <td class='wccontnetbox'> элементов после первого <td class='wcheader1'> элемента. Для этого есть выражение XPath?

ОБНОВЛЕНИЕ : эти элементы являются динамическими.

1 Ответ

5 голосов
/ 13 декабря 2011

Используйте следующее выражение, чтобы выбрать первые два wccontnetbox элемента после первого wcheader1:

//table/tbody/tr[td[@class='wcheader1']][2]/
    following-sibling::tr[td[@class='wccontnetbox']][position()<3]/td 

Я использую //, потому что вы не показываете свой полный ввод. Было бы лучше использовать прямой путь к таблице (например, /html/body/<etc>/table...).

Используйте следующее выражение для выбора всех узлов между первым и вторым wcheader1 элементами:

//table/tbody/tr[td[@class='wcheader1']][1]/following-sibling::tr[
    count(.|//table/tbody/tr[td[@class='wcheader1']][2]/preceding-sibling::tr)
     =
    count(//table/tbody/tr[td[@class='wcheader1']][2]/
        preceding-sibling::tr)]/td[@class='wccontnetbox']

Примечание : во втором выражении используется формула пересечения множества Кайесса. В общем, используйте следующее выражение, чтобы найти пересечение $set1 и $set2:

$set1[count(.|$set2)=count($set2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...