gpt4 book ai didi

xpath - 通过 XPath 查找 xml 中未引用的变量

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

以下 XML 结构是给定屏幕的元数据示例:

<page>
<context>
<variable name="used" type="String" />
<variable name="unused" type="String" />
<variable name="temp" type="Number" />
</context>
<actions>
<assign>
<from>"Test"</from>
<to>used</to>
</assign>
<assign>
<from>1</from>
<to>temp</to>
</assign>
</actions>
</page>

我正在寻找一个 XPath 表达式,它可以返回页面中未引用的变量列表。在此示例中,它是 未使用 多变的。

鉴于:
not(/page/actions//*/text() = 'unused') => Returns true (unreferenced)
not(/page/actions//*/text() = 'used') => Returns false


/page/context/variable[not(/page/actions//*/text() = @name)] => Return unused variable node
/page/context/variable[/page/actions//*/text() = @name] => Returns the used and temp variable node

只要文本与变量的名称完全匹配,这一切都有效。但是,由于文本是一个表达式,它不仅可以包含变量名,还可以包含在字符串中的任何位置。

所以我想到了使用 包含(干草堆,针)做与上面相同的事情。

鉴于:
/page/actions//*[contains(text() , 'temp')] => Returns the temp variable node
not(/page/actions//*[contains(text() , 'unused')]) => Returns true

我认为其中一个会起作用:
/page/context/variable[not(/page/actions//*[contains(text(), @name)])]

我假设@name 不起作用,因为它不在变量节点的范围内,而是来自//*

也不
/page/context/variable[not(contains(/page/actions//*/text(), @name))]

它返回所有 3 个变量。

谁能指导我:
  • 为什么它适用于平等而不适用于包含?
  • 什么表达式会给我返回正确的结果?

  • 理想情况下,这是通过使用 XPath 规范的 1.0 版来实现的。

    最佳答案

    它与相等性一起使用的原因是您的谓词正在过滤 /page/context/variable元素,所以 @name正在引用该变量元素的属性,而 =是一个集合比较,可以测试(多个)/page/actions//text() 中是否有任何一个节点值等于(单个)@name .

    您尝试使用的 XPath 存在两个问题 contains()和:

  • 在 Action 元素的谓词过滤器中,@name将解析为谓词正在过滤的上下文元素的名称属性。它不知道您指的是 /page/context/variable 的名称属性。元素。
  • 可以有多个text() , 和 contains()第一个参数需要一个项目。

  • XPath 2.0 或更高版本,您可以使用以下 XPath,它绑定(bind)​​ @name到一个变量,然后测试是否有任何 text() /page/actions 的节点后代包含变量 $name值(value)。
    /page/context/variable[
    let $name := @name
    return not(/page/actions//*/text()[contains(., $name)])
    ]

    关于xpath - 通过 XPath 查找 xml 中未引用的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51994085/

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