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

时间:2013-08-28 14:01:25

标签: xml xpath plsql

我正在尝试使用以下代码过滤掉不包含给定状态代码的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 个答案:

答案 0 :(得分:2)

来自XPath 1.0 specs

  

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

而您需要这些多个//return[not(...)]

的交集

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

//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
        )
    ]