2

在 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)"

确定上述相对路径的实际放置位置的属性。什么是正确/简洁/有效的方法来捕获这个路径/节点的父节点一直到根节点,特别是那些具有“转换”属性的节点?

4

2 回答 2

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>]
于 2013-01-09T02:34:41.297 回答
2

什么是正确/简洁/有效的方法来捕获这个路径/节点的父节点一直到根节点,特别是那些具有“转换”属性的节点?

使用

ancestor::*[@transform]

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

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

ancestor::*/@transform

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

ancestor::*/@transform[starts-with(normalize-space(@transform),'translate(')]
于 2013-01-09T13:52:41.603 回答