что означает этот xpath? - PullRequest
       1

что означает этот xpath?

2 голосов
/ 31 декабря 2010
//p[not(ancestor::*[3])]
  //table[ancestor::*[1][self::p] or ancestor::*[2][self::p]]
    tr/td//a[ancestor::*[1`][self::td] or ancestor::*[2][self::td]]

Ответы [ 3 ]

3 голосов
/ 31 декабря 2010
//                               # from the root node, look at all descendants
p[                               # select nodes of type <p>, who have…
  not(ancestor::*[3])            #   …no ancestor 3 levels up
]                                #
//                               # from these nodes, select descendants
table[                           # of type <table>, who have…
  ancestor::*[1][self::p]        #   …a <p> as their direct ancestor
  or                             #   or
  ancestor::*[2][self::p]        #   …a <p> as their second ancestor
]                                # 
                                 # syntax error, this should be a location step
tr                               # …select all nodes of type <tr>
/                                # from their children…
td                               # …select all nodes of type <td>
//                               # from their descendants…
a[                               # …select all nodes of type <a>, who have
  ancestor::*[1][self::td]       #   …a <td> as their direct ancestor   
  or                             #   or 
  ancestor::*[2][self::td]       #   …a <td> as their second ancestor
]

Или, выраженный в HTML:

<html>
  <body>
    <p>
      <table>
        <tr> 
          <td>
            <a title="These would be selected." />
          </td>
        </tr>
      </table>
    </p>
  </body>
</html>

В целом XPath не имеет особого смысла. Само собой разумеется, что <p><table> является недействительным HTML.

2 голосов
/ 31 декабря 2010

Давайте разберем это:

//p[not(ancestor::*[3])]

Выбирает все p теги, у которых нет 3-го предка.

В тех:

//table[ancestor::*[1][self::p] or ancestor::*[2][self::p]]

Он выбирает все теги table, первый или второй предок которых является тегом p.

Тогда:

tr/td//a[ancestor::*[1`][self::td] or ancestor::*[2][self::td]]

Это не совсем правильно (в начале должен быть /). Тем не менее, значение tr/td// s уменьшается, чтобы выбрать все теги a, первый или второй предок которых является тегом td.


В общем и целом, оно очень запутанное, и, возможно, его будет гораздо проще достичь с помощью некоторых id атрибутов, определенных в соответствующих местах.

1 голос
/ 31 декабря 2010

Указанное вами XPath-выражение:

//p[not(ancestor::*[3])]
     //table[ancestor::*[1][self::p] or ancestor::*[2][self::p]]
           tr/td//a

синтаксически недопустимо - отсутствует / перед tr.

Исправленный XPathвыражение :

//p[not(ancestor::*[3])]
     //table[ancestor::*[1][self::p] or ancestor::*[2][self::p]]
           /tr/td//a

было предоставлено в качестве ответа на этот вопрос .

Как объяснено в связанном (выше) ответе,значение:

Это выбирает все элементы, чей родитель или прародитель - td, чей родитель - tr, чей родитель - таблица, чей родитель или дед - p, который имеетменее 3 ancesstor - элементов

ОП хотел получить способ * получить элементы a, которые могут быть расположены под p скрытыми не ниже 3 уровней под корнем документа, а затемпод table/tr/td, где table похоронен на уровне не более 3 от p.

Конечно, желание выбирать такие узлы может показаться не слишком значимым , но мы не в состоянии судить о чьих-либо потребностях и требованиях.

АмаФактом является то, что XPath настолько мощен, чтобы удовлетворить даже такие требования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...