как выбрать столбец столбца по имени заголовка столбца с помощью xpath

У меня есть таблица результатов, и она выглядит следующим образом:

<table>
  <thead>
    <tr>
      <th>Id</th>
      <th>Type</th>
      <th>Amount</th>
      <th>Price</th>
      <th>Name</th>
      <th>Expiration</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>123</td>
      <td>Paper</td>
      <td>10 pcs.</td>
      <td>$10</td>
      <td>Premium Copier paper</td>
      <td>None</td>
    </tr>
    <tr>
      <td>321</td>
      <td>Paper</td>
      <td>20 pcs.</td>
      <td>$20</td>
      <td>Extra Copier paper</td>
      <td>None</td>
    </tr>
  </tbody>

And i want to select the whole column by its name with xpath e.g. i want the returned result to be an array of {<td>$10</td>, <td>$20</td>} if selected by column name "Price". I'm new to xpath and not really sure how to do this, but i'm pretty sure it's possible.

12
nl ja de

3 ответы

Хорошо, я нашел ответ, который был бы достаточным и выглядел бы довольно изящным. Здесь идет требуемая строка XPath:

//table/tbody/tr/td[count(//table/thead/tr/th[.="$columnName"]/preceding-sibling::th)+1]

Поместите имя столбца вместо $ columnName. Это хорошо работает для меня. Нет XSL или ничего, просто чистая строка xpath. Как применить это - это еще один вопрос.

24
добавлено

Если вы нашли решение, я предлагаю опубликовать его в качестве ответа здесь, но просто для удовольствия, вот как я подхожу к этому:


  

  
  

  
    
      
    
  

  
    
      
    
  

  
    
      
    
  

При запуске с «Цена» в качестве значения параметра:


  <td>$10</td>
  <td>$20</td>

При запуске с именем «Имя» в качестве значения параметра:


  <td>Premium Copier paper</td>
  <td>Extra Copier paper</td>

1
добавлено

Вы можете использовать этот XPath:

/table/tbody/tr/td[count(preceding-sibling::td)+1 = count(ancestor::table/thead/tr/th[.='Price']/preceding-sibling::th)+1]

Я бы подумал, что тестирование позиции ( position() ) td в отношении позиции соответствующего th будет работать, но это не кажется, когда я тестировал.

1
добавлено
@EduardSukharev - Вы должны добавить свое решение в качестве ответа и принять его.
добавлено автор Daniel Haley, источник
Кажется, это не сработает. Не знаю, почему, но я нашел решение уже.
добавлено автор Eduard Sukharev, источник
Да, но я нахожусь на низких точках, поэтому не мог добавить свое собственное решение в течение первых 6 часов.
добавлено автор Eduard Sukharev, источник