gpt4 book ai didi

xpath - 选择所有节点,直到特定的给定节点/标签

转载 作者:行者123 更新时间:2023-12-03 16:10:03 25 4
gpt4 key购买 nike

给定以下标记:

<div id="about">
<dl>
<dt>Date</dt>
<dd>1872</dd>
<dt>Names</dt>
<dd>A</dd>
<dd>B</dd>
<dd>C</dd>
<dt>Status</dt>
<dd>on</dd>
<dt>Another Field</dt>
<dd>X</dd>
<dd>Y</dd>
</dl>
</div>

我正在尝试提取所有 <dd> <dt>Names</dt> 之后的节点但直到另一个<dt>开始。在这种情况下,我在以下节点之后:

<dd>A</dd>
<dd>B</dd>
<dd>C</dd>

我正在尝试以下 XPath 代码,但它没有按预期工作。

xpath("//div[@id='about']/dl/dt[contains(text(),'Names')]/following-sibling::dd[not(following-sibling::dt)]/text()")

关于如何修复它有什么想法吗?

非常感谢。

最佳答案

更新:更简单的解决方案

在您的情况下有一个先决条件,即 anchor 项始终是具有特定属性的第一个前面的兄弟项。因此,这里有一种更简单的方法来编写下面的复杂表达式:

/div/dl/dd[preceding-sibling::dt[1][. = 'Names']]

换句话说:

  • 选择任何dd
  • 有第一个在前的兄弟 dt (前面的兄弟轴倒数)
  • 它本身的值为“Names”

从 oXygen 的以下屏幕截图中可以看出,它会选择您想要选择的节点(如果您将“名称”更改为“状态”或“另一个字段”,它将在下一个之前仅选择以下节点dt 还有)。

screenshot from oXygen of selected nodes

原复解(留作引用)

这在 XPath 2.0 中要容易得多,但我们假设您只能使用 XPath 1.0。诀窍是计算 anchor 元素(其中带有“名称”的元素)前面 sibling 的数量,并忽略任何计数错误的元素(即,当我们跨越 <dt>Status</dt> 时,前面 sibling 的数量为增加)。

对于 XPath 1.0,删除 (: 之间的注释和 :) (在 XPath 中,空格是无意义的,为了可读性,你可以将其设为多行 XPath,但在 1.0 中,注释是不可能的)

/div/dl/dd

(: any dd having a dt before it with "Names" :)
[preceding-sibling::dt[. = 'Names']]

(: count the preceding siblings up to dt with "Names", add one to include 'self' :)
[count(preceding-sibling::dt[. = 'Names']/preceding-sibling::dt) + 1
=

(: compare with count of all preceding siblings :)
count(preceding-sibling::dt)]

单行:

/div/dl/dd[preceding-sibling::dt[. = 'Names']][count(preceding-sibling::dt[. = 'Names']/preceding-sibling::dt) + 1 = count(preceding-sibling::dt)]

关于xpath - 选择所有节点,直到特定的给定节点/标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33188051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com