//parent::* в XPath?

Рассмотрим этот простой пример

library(xml2)

x <- read_xml("<body>
  <p>Some <b>text</b>.</p>
  <p>Some <b>other</b> <b>text</b>.</p>
  <p>No bold here!</p>
</body>")

Теперь я хочу найти всех родителей узлов, содержащих строку otherДля этого я бегу

> xml_find_all(x, "//b[contains(.,'other')]//parent::*")

{xml_nodeset (2)}
[1] <p>Some <b>other</b> <b>text</b>.</p>
[2] <b>other</b>

Я не понимаю, почему я также получаю <b>other</b> элемент, а также. На мой взгляд, есть только один родитель, который является первым узлом.

Это ошибка?

1 ответ

Решение

+ Изменить

//b[contains(.,'other')]//parent::*

который выбирает потомок-или-себя (и вы не хотите себя) и родителя, чтобы

//b[contains(.,'other')]/parent::*

который выбирает чисто по родителю, чтобы исключить <b>other</b> из выбора.

Или, еще лучше, используйте этот XPath:

//p[b[contains(.,'other')]]

если вы хотите выбрать все p элементы с b дочерний элемент, строковое значение которого содержит "другую" подстроку, или

//p[b = 'other']

если bСтроковое значение должно равняться other, См. Также Что содержит () в XPath?

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