【问题标题】:Select nodes containing a child with a class that contains X选择包含具有包含 X 的类的子节点的节点
【发布时间】:2015-05-08 08:08:28
【问题描述】:

我得到了以下 XML:

  <a> 
    <div class="from ng-binding">Stranger</div>  
    <div class="subject ng-binding">Hello there</div>  
    <div class="time ng-binding"</div> 
  </a>

我正在尝试选择具有子类的子类包含“主题”的 a 标记(因此基本上是本示例的 a 标记)。

我尝试了以下方法:

//a[contains(.//div/@class,'subject')]

但它没有选择任何东西。 我将其更改为 //a[contains(.//div/@class,'from')] 并且有效,所以我不明白问题所在。 不应该.//check 节点的所有子节点吗?

【问题讨论】:

  • 仅供参考,XPath 不选择任何 标签。它对 XML 的逻辑结构(例如元素)进行操作,而不是对表面结构进行操作。

标签: xml xpath xml-parsing xpath-2.0


【解决方案1】:

你想要

//a[.//div[contains(@class, 'subject')]]

contains() 函数只接受第一个参数中的第一项,因此如果您将.//div/@class 作为第一个参数传递给contains(),您将只测试.//div/@class 的第一个结果,而不是测试所有其中。

也就是说,你尝试的代码本质上等同于

//a[contains((.//div/@class)[1],'subject')]

【讨论】:

  • 实际上,在 XPath 2.0 中(根据问题标签)contains(.//div/@class,'from') 应该引发类型错误,因为contains 的第一个参数必须是一个序列不超过一项。
  • @IanRoberts:很好地解决了 XPath 2.0 类型错误。本来想查官方参考的,但是没有。我在 XPath 1.0 上学习过,但从未完全更新过我的知识。
猜你喜欢
  • 2014-10-02
  • 2021-11-15
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多