gpt4 book ai didi

XPath - 获取具有条件的文本节点的父节点

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

<doc ok="yes">
<a>
<b>
<c>
aa
<d ok="yes">
bb
</d>
cc
</c>
</b>
</a>
<e>
ee
</e>
<f ok="no">
no
</f>
</doc>

我需要使用 XPath 检索节点列表,其中每个节点必须满足以下条件:
  • 节点至少有一个子文本节点
  • 如果节点(或祖先轴中最近的节点)具有属性 "ok" ,该值必须是 "yes"
  • 当任何祖先是结果的一部分时,排除节点

  • 所以在我的样本中,我想得到 <c><e> .节点 <d>被排除,因为它是 <c> 的 child ,这是结果的一部分。

    我已经开始使用这个表达式 //*[count(./text()[normalize-space()])>0] 的条件 (1) .它返回 <c> , <d> , <e><f> .我不知道如何排除 <d>

    最佳答案

    我会将其分为 2 个步骤。
    首先,只考虑条件 1 和 2。

    //*[text()[normalize-space()]]
    [
    ancestor-or-self::*[not(@ok)]
    or
    ancestor-or-self::*[@ok][1][@ok='yes']
    ]

    给定有问题的 XML 作为输入,xpath 上方返回 3 个元素: <c> , <d> , 和 <e> .

    下一步是实现条件数 3。这可以通过重复第一步中使用的相同谓词来完成,但现在是 ancestor::*而不是当前节点。然后使用 not() 否定重复的谓词因为我们希望祖先在条件 1 和 2 中失败(我们希望当前节点的祖先不是结果的一部分):
    [not(
    ancestor::*[text()[normalize-space()]]
    [
    ancestor-or-self::*[not(@ok)]
    or
    ancestor-or-self::*[@ok][1][@ok='yes']
    ]
    )
    ]

    将这两个步骤结合在一起,您将获得以下 xpath :
    //*[text()[normalize-space()]]
    [
    ancestor-or-self::*[not(@ok)]
    or
    ancestor-or-self::*[@ok][1][@ok='yes']
    ]
    [not(
    ancestor::*[text()[normalize-space()]]
    [
    ancestor-or-self::*[not(@ok)]
    or
    ancestor-or-self::*[@ok][1][@ok='yes']
    ]
    )
    ]

    最终 xpath 中的每个外部谓词 ( [] ) 依次表示条件 1、2 和 3。

    关于XPath - 获取具有条件的文本节点的父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30371183/

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