2013-01-09 144 views
2

的所有家長的屬性在SVG文件,我用xpath發現包含相對SVG路徑的節點,例如,Python的LXML XPATH - 找到特定節點

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

屬性,確定上述相對路徑的實際位置位置。捕獲這條路徑/節點的父節點到根節點的正確/簡潔/有效的方式是什麼,特別是那些具有「變換」屬性的節點?

回答

2

什麼是正確的/簡潔/有效的抓住這個 路徑的家長路/一直到根的節點,特別是那些h大約 「變換」屬性?

使用

ancestor::*[@transform] 

這裏選擇有transform屬性的所有祖先元素。

我們可以選擇直接祖先的所有transform屬性:

ancestor::*/@transform 

如果你有興趣只有在那些transform屬性,其字符串值開始以字符串「翻譯(」(可能之前由空白),使用:

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

謝謝,非常有幫助!有一件事:'@ transform'在選擇祖先元素*時起作用,但當直接選擇轉換屬性開始w /「translate(」,它應該是'.'而不是 - '祖先:: */@ transform [starts-with正則化空間(。),'translate(')]' –

+0

@HonoreDoktorr,是的,答案是針對特定問題和大量超出範圍的其他可能的問題。例如,另一個變體,當需要屬性祖先和上下文項本身都可以使用'祖先或自己::'軸 –

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>] 
+2

雖然這個答案讓我通過這個問題,並首先,@ Dimitre的答案更具說明性,所以我選擇它作爲解決方案。謝謝! –