在 xpath 中使用 [not] 检索与给定值不匹配的内容 (PLSQL)

Posted

技术标签:

【中文标题】在 xpath 中使用 [not] 检索与给定值不匹配的内容 (PLSQL)【英文标题】:Using [not] in xpath to retrieve content that does not match given values (PLSQL) 【发布时间】:2013-08-28 14:01:24 【问题描述】:

我正在尝试使用以下代码过滤掉不包含给定状态代码的 xml 返回标签:

l_xml_return := (xmltype(l_xml_response).extract('//return[not(issueStatusId=84388)]|
                                                                      //return[not(issueStatusId=73630)]|
                                                                      //return[not(issueStatusId=67539)]|
                                                                      //return[not(issueStatusId=42527)]|
                                                                      //return[not(issueStatusId=22702)]|
                                                                      //return[not(issueStatusId=20643)]|
                                                                      //return[not(issueStatusId=4368)]|
                                                                      //return[not(issueStatusId=4363)]|
                                                                      //return[not(issueStatusId=4364)]
                                                                     ').getclobval());

我的 xml 包含以下内容:

<results>
  <return>
    <issueStatusId>84388</issueStatusId>
    <name>Test 1</name>
  </return>
  <return>
    <issueStatusId>4364</issueStatusId>
    <name>Test 2</name>
  </return>
  <return>
    <issueStatusId>999999</issueStatusId>
    <name>Test 3</name>
  </return>
</results>

使用此 xml 代码和 xpath 语句,仅应返回问题状态为 999999 的返回标记,但事实并非如此。

有人知道这是为什么吗?

干杯,

Jezzipin

【问题讨论】:

【参考方案1】:

来自XPath 1.0 specs

| 运算符计算其操作数的并集,它必须是节点集。

而你需要这些多个//return[not(...)]的交集

您可以在多个not() 条件上使用and 作为谓词

//return[
    not(issueStatusId=84388) and
    not(issueStatusId=73630) and
    not(issueStatusId=67539) and
    not(issueStatusId=42527) and
    not(issueStatusId=22702) and
    not(issueStatusId=20643) and
    not(issueStatusId=4368) and
    not(issueStatusId=4363) and
    not(issueStatusId=4364)]

或等效:

//return[
    not(
        issueStatusId=84388 or
        issueStatusId=73630 or
        issueStatusId=67539 or
        issueStatusId=42527 or
        issueStatusId=22702 or
        issueStatusId=20643 or
        issueStatusId=4368 or
        issueStatusId=4363 or
        issueStatusId=4364
        )
    ]

【讨论】:

+1 最后一个.. :) 非常感谢。最后一个是我需要的。遗憾的是,关于 XPATH 的 W3CCHOOLS 信息有点缺乏,而且我并没有真正使用 XML,所以不确定是否有 or 运算符。

以上是关于在 xpath 中使用 [not] 检索与给定值不匹配的内容 (PLSQL)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Xpath检索XML文件中的命名空间

xpath常用函数

如何在 PHP 中使用 XPath 设置 (not(contains))

如何在 XPath 中使用 not contains()?

如何使用 Xpath 检索 XML 文件中的命名空间

如何获取元素的 xPath,并再次从 xPath 检索元素