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','>','')