PythonLXML XPATH——查找特定节点的所有父节点的属性

PythonLXML XPATH——查找特定节点的所有父节点的属性,python,xpath,svg,lxml,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”属性的路径/节点 使用 'ancestor::*[starts-with(@transfor

在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”属性的路径/节点

使用

'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")]'))
将lxml.etree作为ET导入
内容=“”
'''
doc=ET.fromstring(内容)
对于doc.xpath(“//path”)中的路径:
打印(path.xpath('祖先::*[以(@transform,“translate”)]'开头)
屈服

[<Element bar at 0xb749448c>, <Element foo at 0xb7494504>]
[,]
什么是正确/简洁/有效的方法来捕捉这一点的父母 路径/节点一直到根,尤其是那些具有 “转换”属性

使用

ancestor::*[@transform]
ancestor::*/@transform
这将选择所有具有
transform
属性的祖先元素

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

ancestor::*[@transform]
ancestor::*/@transform
如果您只对那些
transform
属性感兴趣,这些属性的字符串值以字符串“translate”(
)开头(前面可能有空格),请使用:


虽然这个答案让我解决了这个问题,而且是第一个,@Dimitre的答案更具解释性,所以我选择它作为解决方案。谢谢!谢谢,非常有用!有一件事:
@transform
在选择祖先元素时起作用,但在直接选择转换属性时,从w/“translate(”,它应该是
而不是-
祖先::*/@transform[以(规范化空格(.),'translate(')开头]
@HonoreDoktorr,是的,答案是针对特定问题和大量超出范围的其他可能问题。例如,另一种变体,当需要祖先属性和上下文项本身时,可以使用
祖先或自我::