Найти определенную позицию элемента в XPath после проверки условия

У меня есть следующий HTML-код, с которым я работаю: (кусок этого здесь)

<table class="detailTable">
  <tbody>
    <tr>
      <td class="detailTitle" align="top">
        <h3>Credit Limit:</h3>
        <h3>Current Balance:</h3>
        <h3>Pending Balance:</h3>
        <h3>Available Credit:</h3>
      </td>
      <td align="top">
        <p>$677.77</p>
        <p>$7.77</p>
        <p>$7.77</p>
        <p>$677.77</p>
      </td>
      <td class="detailTitle">
        <h3>Last Statement Date:</h3>
        <h4>Payment Address</h4>
      </td>
      <td>
        <p>   05/19/2015  </p>
        <p class="attribution">
      </td>
    </tr>
  </tbody>
</table>

Мне нужно сначала проверить, если "Statement Date"существует, а затем найти свою позицию. Затем получить его значение, которое находится в соответствующем <p> тег. Мне нужно сделать это с помощью XPath. Какие-либо предложения?

До сих пор я пытался использовать //table[@class='detailTable'][1]//td[2]//p[position(td[contains(.,'Statement Date')])] но это не работает

2 ответа

Решение

Это один из возможных способов: (отформатирован для удобства чтения)

//table[@class='detailTable']
//tr
/td[*[contains(.,'Statement Date')]]
/following-sibling::td[1]
/*[position() 
      = 
    count(
        parent::td
        /preceding-sibling::td[1]
        /*[contains(.,'Statement Date')]/preceding-sibling::*
    )+1
  ]

объяснение:

  • ..../td[*[contains(.,'Statement Date')]]: От начала до этой части XPath найдет td элемент, в котором хотя бы один из его дочерних элементов содержит текст "Statement Date"
  • /following-sibling::td[1]: из ранее подобранных td, перейдите к ближайшему брату td...
  • /*[position() = count(parent::td/preceding-sibling::td[1]/*[contains(.,'Statement Date')]/preceding-sibling::*)+1]:... и вернуть дочерний элемент в позиции, равной позиции элемента, который содержит текст "Statement Date" в предыдущем td, Обратите внимание, что мы используем count(preceding-sibling::*)+1 получить индекс позиции элемента, содержащего текст "Statement Date" Вот.

Вы можете сделать это следующим образом:

//table[@class='detailTable'][1]//td[@class="detailTitle" and contains(./h3, 'Statement Date')]/following-sibling::td[1]/p[1]/text()

Это найдет <td> который содержит Statement Date направиться и получить <td> сразу после этого. Затем он получает текстовое содержание первого p в этом <td>,

Другие вопросы по тегам