基于元素值和同一元素多个属性的Marklogic查询

Marklogic query based on values of element and multiple attributes of the same element

这个问题与 this one 相似,但有所不同。

我有以下 xml:

doc1.xml

<Companies>
<Company id="63919" isSubject="N" refType="SEC">
     <IsRestricted value="true"/>
     <Name>Caixa</Name>
</Company>
<Company id="13332" isSubject="Y" refType="PRI">
      <Name>Banco</Name>
</Company>
</Companies>

doc2.xml

<Companies>
<Company id="13336" isSubject="N" refType="SEC">
    <IsRestricted value="false"/>
    <Name>Santander</Name>
</Company>
<Company id="117436" isSubject="N" refType="PRI">
    <Name>Bankia</Name>
</Company>
</Companies>

doc3.xml

<Companies>
<Company id="12236" isSubject="N" refType="SEC">
    <Name>Inter</Name>
</Company>
<Company id="134562" isSubject="N" refType="PRI">
    <IsRestricted value="true"/>
    <Name>Liber</Name>
</Company>
</Companies>

我的搜索需要排除 refType='PRI' & isSubject='Y' & IsRestricted-value='true' 的文档。因此,在我的示例中,结果应包含 doc1.xmldoc2.xml 但不是 doc3.xml.

我认为以下查询可以完成这项工作:

cts:search(/,
  cts:not-query(
    cts:element-query(xs:QName("Company"),cts:and-query((
    cts:element-attribute-value-query(xs:QName("Company"),xs:QName("refType"),"PRI",(),0),
    cts:element-attribute-value-query(xs:QName("Company"),xs:QName("isSubject"),"Y",(),0),
    cts:element-attribute-value-query(xs:QName("IsRestricted"),xs:QName("value"),"true",(),0) 
   )))
  )
)

但它只是 returns doc2.xml。我已更新查询:

cts:search(/,
  cts:not-query(
  cts:near-query((
   cts:element-attribute-value-query(xs:QName("Company"),xs:QName("refType"),"PRI",(),0),
   cts:element-attribute-value-query(xs:QName("Company"),xs:QName("isSubject"),"Y",(),0),
   cts:element-attribute-value-query(xs:QName("IsRestricted"),xs:QName("value"),"true",(),0) 
   )))
)

好像也不行。只有 returns doc2.xml.

cts:search(fn:collection("companies"),
cts:not-query(
  cts:and-query((
                  cts:element-attribute-value-query(xs:QName("Company"), 
                  xs:QName("refType"), "PRI"),
                  cts:element-attribute-value-
                 query(xs:QName("Company"),xs:QName("isSubject"),"Y"),
                 cts:element-attribute-value-
                 query(xs:QName("IsRestricted"),xs:QName("value"),"true")))))  

这会给你想要的结果。