我有一些数据是这样的:
<wrapper>
<inner a="1"/>
<inner a="2" b="3"/>
</wrapper>属性b可能存在于每个内部元素上,也可能不存在于每个内部元素上。我的目标是找到所有包含至少一个没有属性b.*的内部元素的文档。
This similar question提出了答案:
cts:not-query(cts:element-attribute-value-query(xs:QName('inner'), xs:QName('b'), '*', ("wildcarded"))))但是这不起作用,因为同一文档中的某些内部元素可能具有属性b,而非查询可以处理整个片段,因此不会返回像上面这样的混合情况。将其封装在元素查询中没有帮助,而cts:和非查询似乎也是如此。
我还尝试使用共现/值函数来读取相关属性a的值,但这似乎也是不可能的。如果不存在元素文本,则可能会在同时出现的调用上设置邻近设置,因此属性被用相同的单词位置进行索引。
除了钝式xpath之外,还有其他选择吗?
//inner[@a and not(@b)]发布于 2022-08-26 17:28:06
cts:not-in-query有必要的行为使它在cts:and-not-query不能工作的情况下工作。
cts:not-in-query(
cts:element-query(xs:QName('inner'), cts:true-query()),
cts:element-attribute-query(xs:QName('inner'), xs:QName('b'),'*','wildcarded')
)在与属性b的“内部”元素的位置不匹配的位置上查找所有“内部”元素。
必须启用元素位置索引。必须启用通配符索引。
http://docs.marklogic.com/cts:not-in-query
发布于 2018-10-11 02:02:48
如果简单性不是您的目标,那么始终可以使xpath变得更加复杂。这个怎么样?(它更准确地回答了“返回所有包含”innner“元素的文档,而这些元素没有atribute @b‘的问题。)
doc()[exists(//inner[not(@b)])]我不知道优化得有多好--一些xpath表达式优化到了等效的cts: query,而有些则没有。
还有一个“技巧”涉及将cts表达式组合成映射。以2次搜索的结果为例,使用返回结果的选项作为映射,然后可以使用此页面上的操作https://developer.marklogic.com/blog/im-a-map进行非常高效的集操作(并、交、差等)。如果构造正确,这种技术可以和“本地”cts搜索一样快-- cts搜索在内部使用相同的通用技术来解析结果。
发布于 2021-04-21 20:45:12
使XPath成为路径范围索引。//inner[@a and not(@b)],或者如果没有元素文本,//inner[@a and not(@b)]/@a,则执行
cts:path-range-query('//inner[@a and not(@b)]/@a','>','')这也使我们能够使用@a有效地回答哪些@b值丢失的问题。
https://stackoverflow.com/questions/52750613
复制相似问题