Можно ли получить все узлы контекста, используемые для оценки результата xpath? - PullRequest
1 голос
/ 25 января 2010

Возможно ли получить все узлы контекста, используемые для оценки результата xpath? В следующем коде:

test_xml = """
<r>
    <a/>
    <a>
        <b/>
    </a>
    <a>
        <b/>
    </a>
</r>
"""
test_root = lxml.etree.fromstring(test_xml)
res = test_root.xpath("//following-sibling::*[1]/b")
for node in res:
    print test_root.getroottree().getpath(node)

Результат:

/r/a[2]/b
/r/a[3]/b

Возможно ли получить все узлы контекста, использованные в приведенной выше оценке xpath:

/r/a[1] /r/a[2] /r/a[2]/b

и для второго результата:

/r/a[2] /r/a[3]/b /r/a[3]/b

? При использовании дочерней оси я мог получить эти узлы от работы на

element_tree.getpath(elem)

а как насчет других осей?

TIA, привет

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Я изменил xpath для каждого этапа, чтобы узнать, какие элементы будут оцениваться в результате:

for node in res:
    j = node.xpath('./parent::*')[0]
    k = j.xpath('./preceding-sibling::*[1]')[0]
    # You didn't specify these but they were used in the evaluation
    ancestors = k.xpath('./ancestor::*')
    for item in [node, j, k] + ancestors:
        print item.getroottree().getpath(item)
    print '\n\n'

дает мне:

/ r / a [2] / b, / r / a [2], / r / a [1], / r

/ r / a [3] / b, / r / a [3], / r / a [2], / r

0 голосов
/ 29 января 2010

Если я правильно понимаю ваш вопрос, вы пытаетесь просто получить узлы-предки определенных узлов. Выражение XPATH для этого будет:

//particular-element/ancestor::*

, таких как:

/r/a[2]/b/ancestor::*
...