xPath: выберите следующие дочерние и собственные узлы - PullRequest
2 голосов
/ 13 июля 2010

Из этого фрагмента HTML:

<tbody>
    <tr>
    <tr id="1" class="first">
    <tr id="2" class="">
    <tr id="3" class="last">
    <tr id="4" class="first">
    <tr id="5" class="">
    <tr id="6" class="last">
<tbody>

Я пытаюсь получить выражение xPath для возврата всех узлов tr [@ class = 'first'], за которыми следует tr, у которых нет символа "Первый "класс, в том числе первый узел.В этом случае набор с идентификаторами 1, 2, 3 и tr с идентификаторами 4, 5, 6.

Я пытался использовать:

//tbody/tr[@class='first']/self::* | following-sibling::tr[not(starts-with(@class, 'first'))]

Безуспешно.Есть мысли по этому поводу?

Спасибо

1 Ответ

0 голосов
/ 13 июля 2010

Хотя это не точно , что вы хотите, это выражение вернет все узлы между первым и последним классом, но не сгруппирует их вместе. Это лучшее, что вы сможете сделать, используя только одно выражение XPath.

С учетом такого ввода,

<tbody>
  <tr id="0" class=""/>
  <tr id="1" class="first"/>
  <tr id="2" class=""/>
  <tr id="3" class="last"/>
  <tr id="4" class="first"/>
  <tr id="5" class=""/>
  <tr id="6" class="last"/>
  <tr id="7" class=""/>
</tbody>

Это выражение XPath,

/tbody/tr[
  (following-sibling::tr[@class='last'] and preceding-sibling::tr[@class='first'])
  or @class='first' or @class='last'
]

Вернет эти узлы:

<tr id="1" class="first" />
<tr id="2" class="" />
<tr id="3" class="last" />
<tr id="4" class="first" />
<tr id="5" class="" />
<tr id="6" class="last" />

Выражение работает, проверяя все элементы tr, у которых предыдущий брат - «первый», а следующий - «последний». Таким образом, это исключит tr s из этих.

Однако это не делает никакой группировки. Я не знаю ни одного способа сделать такую ​​группировку с одним выражением XPath. Если бы мне пришлось это сделать, я бы получил одно выражение XPath, которое вернуло бы все «первые» tr с, а затем прошел бы по его братьям и сестрам, пока не нашел бы «последний» tr. Может быть, кто-то еще знает о лучшем способе сделать это.

...