Python lxml XPATH - 查找特定节点的所有父节点的属性

时间:2013-01-09 02:25:39

标签: python xpath svg lxml

在SVG文件中,我使用xpath查找包含相对SVG路径的节点,例如

<path d="m -0.3,-0.3 l 0.6,0 l 0,0.6 l -0.6,0 l 0,-0.6 z" transform="translate(-1 -0.5)"/>

此节点的各个父节点一直到根

transform="translate(X Y)"

属性,用于确定上面相对路径的实际放置位置。捕获此路径/节点的父节点到root的正确/简洁/有效方法是什么,特别是那些具有“transform”属性的方法?

2 个答案:

答案 0 :(得分:3)

使用

'ancestor::*[starts-with(@transform,"translate")]'

例如:

import lxml.etree as ET

content = '''
<bar transform="translate(1 1)">
<foo transform="translate(1 1)">
<path d="m -0.3,-0.3 l 0.6,0 l 0,0.6 l -0.6,0 l 0,-0.6 z" transform="translate(-1 -0.5)"/>
</foo>
</bar>
'''
doc = ET.fromstring(content)
for path in doc.xpath('//path'):
    print(path.xpath('ancestor::*[starts-with(@transform,"translate")]'))

产量

[<Element bar at 0xb749448c>, <Element foo at 0xb7494504>]

答案 1 :(得分:2)

  

捕捉父母的正确/简洁/有效方法是什么?   路径/节点一直到根,特别是那些有   'transform'属性?

使用

ancestor::*[@transform]

这将选择具有transform属性的所有祖先元素。

可以直接选择祖先的所有transform属性

ancestor::*/@transform

如果您只对transform属性感兴趣,其字符串值以字符串“translate(”(可能前面有空格)开头),请使用:

ancestor::*/@transform[starts-with(normalize-space(@transform),'translate(')]