2014-10-18 46 views
3

這是我的xml文件的一個小樣本。Xpath local-name()中的屬性

<w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
    <w:pPr> 
     <w:rPr> 
     <w:highlight w:val="yellow"/> 
     </w:rPr> 
    </w:pPr> 
    <w:bookmarkStart w:id="0" w:name="_GoBack"/> 
    <w:bookmarkEnd w:id="0"/> 
    <w:r w:rsidRPr="00D1434D"> 
     <w:rPr> 
     <w:rFonts w:ascii="Times New Roman" 
        w:eastAsia="MS PGothic" 
        w:hAnsi="Times New Roman"/> 
     <w:b/> 
     <w:color w:val="000000"/> 
     <w:sz w:val="24"/> 
     <w:szCs w:val="24"/> 
     <w:highlight w:val="yellow"/> 
     </w:rPr> 
     <w:t xml:space="preserve">Responses to </w:t> 
    </w:r> 
    <w:r w:rsidR="00335D4A" w:rsidRPr="00D1434D"> 
     <w:rPr> 
     <w:rFonts w:ascii="Times New Roman" 
        w:eastAsia="MS PGothic" 
        w:hAnsi="Times New Roman"/> 
     <w:b/> 
     <w:color w:val="000000"/> 
     <w:sz w:val="24"/> 
     <w:szCs w:val="24"/> 
     <w:highlight w:val="yellow"/> 
     <w:lang w:eastAsia="ja-JP"/> 
     </w:rPr> 
     <w:t>the Reviewer</w:t> 
    </w:r> 
</w:p> 

我想提取與w:highlight標籤特別具有屬性value = 「黃色」文本。我搜索了它,但無法提出解決方案。在一般的亮點

以下工作:

for t in source.xpath('.//*[local-name()="highlight"]/../..//*[local-name()="t"]'): 
    do something 

我想:

for t in lxml_tree.xpath('//*[local-name()="highlight"][@val="yellow"]/../..//*[local-name()="t"]'): 

這是不行的,沒有返回..

+0

對於未來的問題,確保你的XML是_properly formatted_和可讀性(一個令人難以置信的長線不是)。另外,'w:'前綴沒有被聲明,你的XML代碼片段格式不正確,因爲缺少''。 – 2014-10-18 10:00:45

+0

如何在SO上格式化xml數據? – 2014-10-18 10:01:46

+0

這個[問題](http://stackoverflow.com/questions/2243131/getting-certain-attribute-value-using-xpath)有點類似,但它在local-name()上不起作用。 – 2014-10-18 10:03:44

回答

8

w:val屬性是命名空間,因此你不能只通過@val來解決它。一個可能的解決方案是通過使用@*[local-name()='attribute name']表達它的本地名稱,類似於你爲元素是如何處理的屬性:

//*[local-name()="highlight"][@*[local-name()='val' and .='yellow']]/../..//*[local-name()="t"] 
+0

如何使用'following ::'而不是'/../..//'?請參閱http://xsltransform.net/bdxtpQ。 – 2014-10-18 10:12:19

+0

你能解釋你的答案嗎?我不明白@ *是什麼,「和。=」 – 2014-10-18 10:12:31

+1

@Swordy'@ *'表示任何屬性,類似於「// *」,表示任何元素。 '。'指的是當前的上下文,在這個特定的用法中,它是'@ *' – har07 2014-10-18 10:16:15