2009-05-15 2 views
1

Мне нужно запросить узел, чтобы определить, имеет ли он родительский узел, который содержит указанный атрибут. Например:XPath - Как я могу запросить для родительского узла, удовлетворяющего условию присутствия атрибута?

<a b="value"> 
    <b/> 
</a> 

С б, как мой фокус элемента, я хотел бы выполнить запрос XPath:

..[@b] 

что бы вернуть элемент . Возвращаемый элемент должен быть являться родительским узлом a и не должен содержать ни одного из a 's siblings.

В библиотеке lxml.etree указано, что это недопустимое выражение XPath.

ответ

4

Вы не можете совместить графы . или с предикатом. Вместо этого вам нужно будет использовать полную ось parent::. Должно работать для вас:

parent::*[@b] 

Это будет выбрать родительский узел (независимо от его локального имени), IFF имеет «B» атрибут.

1

Я не знаю, о библиотеке lxml.etree но ..[@b] является полноценными XPath (Update: см комментарий Бен Бланка). Аналогично parent::a[@b], он возвращает контекст в элементе a.

+0

Корректировка родительского :: формата [@b] отлично работает. Спасибо. –

+0

@eddiegroves - ".. [@ b]" is * not * valid XPath. Вы не можете комбинировать. или .. сокращает с предикатом. –