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 に答える