//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?