我目前正在使用Open Street Maps数据,我正在尝试选择特定节点的前后兄弟。
我的查询目前看起来像这样:
/osm/way/nd[@ref=203936110]/following-sibling::nd[1]
/osm/way/nd[@ref=203936110]/preceding-sibling::nd[1]
这些查询按预期工作,但我想将它们合并到一个查询中。我确实发现some examples提到这是可能的,但由于某种原因,我无法找到合适的语法来使其发挥作用。
例如,此查询无效:
/osm/way/nd[@ref=203936110]/(following-sibling::nd[1] or preceding-sibling::nd[1])
答案 0 :(得分:1)
如果您使用的是lxml(目前只有supports XPath version 1.0),则必须完全拼出每个XPath,并使用|
加入它们:
'''/osm/way/nd[@ref=203936110]/following-sibling::nd[1]
| /osm/way/nd[@ref=203936110]/preceding-sibling::nd[1]'''
例如,
import lxml.etree as ET
content = '''\
<record>
<nd>First</nd>
<nd>Second</nd>
<nd ref="203936110"></nd>
<nd>Third</nd>
<nd>Fourth</nd>
</record>'''
root = ET.fromstring(content)
for elt in root.xpath('''
//nd[@ref="203936110"]/following-sibling::nd[1]
|
//nd[@ref="203936110"]/preceding-sibling::nd[1]'''):
print(elt.text)
产量
Second
Third