Xquery Marklogic:查找包含没有特定属性的元素的文档(每个文档可能有多个)

Xquery Marklogic:查找包含没有特定属性的元素的文档(每个文档可能有多个),xquery,marklogic,Xquery,Marklogic,我有一些数据如下所示: <wrapper> <inner a="1"/> <inner a="2" b="3"/> </wrapper> 但这不起作用,因为同一文档上的某些内部元素可能具有属性b,而查询不适用于整个片段,因此不会返回上面示例中的混合情况。将其包装到元素查询中没有任何帮助,cts:和not查询的行为方式似乎相同 我还尝试使用共现/值函数来读取相关属性a的值来解决这个问题,但这似乎也是不可能的。在共现调用上使用邻近设置可能是可

我有一些数据如下所示:

<wrapper>
  <inner a="1"/>
  <inner a="2" b="3"/>
</wrapper>
但这不起作用,因为同一文档上的某些内部元素可能具有属性b,而查询不适用于整个片段,因此不会返回上面示例中的混合情况。将其包装到元素查询中没有任何帮助,cts:和not查询的行为方式似乎相同

我还尝试使用共现/值函数来读取相关属性a的值来解决这个问题,但这似乎也是不可能的。在共现调用上使用邻近设置可能是可行的,但没有元素文本,因此属性使用相同的单词位置进行索引

是否有其他方法可以替代钝xpath

//inner[@a and not(@b)]

如果简单性不是您的目标,那么您总是可以使xpath更加复杂。 这个怎么样:(它更准确地回答了“返回所有包含没有atribute@b的'inner'元素的文档”的问题)

doc()[exists(//inner[not(@b)])]
我不知道优化效果如何——有些xpath表达式优化到等价的cts:query,有些则没有


还有一个“技巧”涉及组合以映射表示的cts表达式。取2次搜索的结果,使用以映射形式返回结果的选项,然后您可以使用此页面上的操作执行极其高效的集合操作(并集、交集、差集等)。正确构造后,此技术可以与“本机”cts搜索一样快——cts搜索在内部使用相同的通用技术解析结果。

将XPath作为路径范围索引。
//内部[@a和非(@b)]
,或者如果没有元素文本,
//内部[@a和非(@b)]/@a
,则执行此操作

cts:path-range-query('//inner[@a and not(@b)]/@a','>','')

这恰好也允许我们使用
cts:values

有效地回答
@a
值缺少
@b
的问题。令人烦恼的问题是,是否有一个cts等价物可以被优化到。我想,cts搜索不能返回地图?除了QueryB之外,执行
QueryA会耗尽tree缓存。我很想做
ValueMapA-ValueMapB
,但似乎没有办法生成ValueMapB。
cts:path-range-query('//inner[@a and not(@b)]/@a','>','')