Выражение XPath для поиска текущего элемента, а также дочерних элементов - PullRequest
0 голосов
/ 17 сентября 2018

С выражением .//b я могу найти все элементы ниже текущего элемента с тегом b. Если текущий элемент также имеет тег b, он не будет найден. Как я могу выразить, что я хочу найти всех дочерних элементов текущего тега , а также самого текущего элемента, если он соответствует заданному имени тега?

Вот пример ввода XML:

<a>
  <b>
    <i>
      <u>one</u>
    </i>
    <b>two</b>
  </b>
  <b>three</b>
  <em>four</em>
</a>

Если первый элемент <b> является текущим элементом, я хочу получить все подэлементы (т. Е. Содержащие two) и сам элемент, но не элемент, содержащий three (при поиске тегов b). При поиске тегов u я хочу получить только тот, который содержит one.

Я пробовал .[name()='b']|.//b, но это, видимо, недопустимое выражение.

Я также пытался ..//b, но затем я получал не только сам элемент и элемент, содержащий two, но и элемент, содержащий three.

Возможно ли с одним выражением XPath получить то, что я хочу?

Примечание: я использую это в библиотеке Python lxml / etree, но это не должно иметь никакого значения.

1 Ответ

0 голосов
/ 17 сентября 2018

Вы хотите использовать ось descendant-or-self здесь:

descendant-or-self::b

В качестве альтернативы, вы можете сделать это, что немного короче, чтобы написать ...

self::b|.//b
...