【问题标题】:How to exclude a child node from xpath?如何从 xpath 中排除子节点?
【发布时间】:2020-03-24 08:45:58
【问题描述】:

我有以下代码:

<div class = "content">
  <table id="detailsTable">...</table>
  <div class = "desc">
     <p>Some text</p>
  </div>
  <p>Another text<p>
</div>

我想选择“内容”类中的所有文本,我将使用此 xPath:

doc.xpath('string(//div[@class="content"])')

问题在于它选择了所有文本,包括“表格”标签中的文本。我需要从 xPath 中排除“表”。我将如何实现这一目标?

【问题讨论】:

    标签: xpath


    【解决方案1】:

    XPath 1.0 解决方案:

    substring-after(string(//div[@class="content"]),string(//div[@class="content"]/table))
    

    或者只使用 concat :

    concat(//table/following::p[1]," ",//table/following::p[2])
    

    【讨论】:

    • 谢谢。 substring() 只是按预期进行。
    【解决方案2】:

    XPath 表达式 //div[@class="content"] 选择 div 元素 - 不多也不少 - 应用 string() 函数为您提供元素的字符串值,它是其所有后代文本节点的连接。

    在 XPath 1.0 中可能无法获取除包含在一个特定子项中的所有文本之外的所有文本。使用 XPath 2.0 可以这样做

    string-join(//div[@class="content"]/(node() except table)//text(), '')
    

    但是对于这种操作,您实际上处于转换领域,而不是纯粹的选择,因此您正在扩展 XPath 的设计极限。

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      相关资源
      最近更新 更多