XPath中local-name()的属性

8 投票
1 回答
16765 浏览
提问于 2025-04-28 06:14

这是我xml文件的一个小样本。

<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等于"yellow"的。我搜索过,但没有找到解决办法。

下面的代码可以处理一般的高亮:

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"]'):

这个不行,什么都没返回。

暂无标签

1 个回答

19

w:val 属性属于一个特定的命名空间,所以你不能直接用 @val 来引用它。一个可能的解决办法是使用 @*[local-name()='属性名称'] 这种表达方式,通过属性的本地名称来引用它,这和你对元素的处理方式类似:

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

撰写回答