【问题标题】:Attributes in Xpath local-name()Xpath local-name() 中的属性
【发布时间】:2014-10-18 09:50:25
【问题描述】:

这是我的 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"]'):

这不起作用,什么都不返回..

【问题讨论】:

  • 对于未来的问题,请确保您的 XML 格式正确且可读(不适合长得令人难以置信的行)。此外,未声明 w: 前缀,并且您的 XML sn-p 格式不正确,因为缺少 &lt;/w:p&gt;
  • 如何在 SO 上格式化 xml 数据??
  • this question 有点相似,但它不适用于 local-name()。
  • 不能自动格式化。要么手动完成,要么例如执行正确缩进 XML 的 XSLT 标识转换。

标签: python xml python-2.7 xpath


【解决方案1】:

w:val 属性在命名空间中,所以你不能只用@val 来解决它。一种可能的解决方案是使用@*[local-name()='attribute name'] 表达式通过其本地名称来处理属性,类似于您对元素所做的:

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

【讨论】:

  • following::代替/../..//怎么样?见xsltransform.net/bdxtpQ
  • 你能解释一下你的答案吗?我不明白 @* 做了什么和“and .="
  • @Swordy @* 表示任何属性,类似于//* 表示任何元素。 . 引用当前上下文,在该特定用法中是 @* 引用的属性的值
  • @MathiasMüller 使用以下提取文本也没有突出显示。我在整个 xml 中使用它。
  • @Swordy 它会 - 如果不是因为 OOXML 文档的结构。 w:highlight 之后的第一个 w:t 始终是突出显示的文本。
猜你喜欢
  • 2014-12-07
  • 1970-01-01
  • 2021-11-12
  • 2022-01-22
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多