首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Marklogic:查找包含没有特定属性的元素的文档(每个文档可能有很多)

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

Stack Overflow用户
提问于 2018-10-11 00:47:53
回答 3查看 314关注 0票数 1

我有一些数据是这样的:

代码语言:javascript
复制
<wrapper>
  <inner a="1"/>
  <inner a="2" b="3"/>
</wrapper>

属性b可能存在于每个内部元素上,也可能不存在于每个内部元素上。我的目标是找到所有包含至少一个没有属性b.*的内部元素的文档。

This similar question提出了答案:

代码语言:javascript
复制
cts:not-query(cts:element-attribute-value-query(xs:QName('inner'), xs:QName('b'), '*', ("wildcarded"))))

但是这不起作用,因为同一文档中的某些内部元素可能具有属性b,而非查询可以处理整个片段,因此不会返回像上面这样的混合情况。将其封装在元素查询中没有帮助,而cts:和非查询似乎也是如此。

我还尝试使用共现/值函数来读取相关属性a的值,但这似乎也是不可能的。如果不存在元素文本,则可能会在同时出现的调用上设置邻近设置,因此属性被用相同的单词位置进行索引。

除了钝式xpath之外,还有其他选择吗?

代码语言:javascript
复制
//inner[@a and not(@b)]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-08-26 17:28:06

cts:not-in-query有必要的行为使它在cts:and-not-query不能工作的情况下工作。

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2018-10-11 02:02:48

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

代码语言:javascript
复制
doc()[exists(//inner[not(@b)])]

我不知道优化得有多好--一些xpath表达式优化到了等效的cts: query,而有些则没有。

还有一个“技巧”涉及将cts表达式组合成映射。以2次搜索的结果为例,使用返回结果的选项作为映射,然后可以使用此页面上的操作https://developer.marklogic.com/blog/im-a-map进行非常高效的集操作(并、交、差等)。如果构造正确,这种技术可以和“本地”cts搜索一样快-- cts搜索在内部使用相同的通用技术来解析结果。

票数 1
EN

Stack Overflow用户

发布于 2021-04-21 20:45:12

使XPath成为路径范围索引。//inner[@a and not(@b)],或者如果没有元素文本,//inner[@a and not(@b)]/@a,则执行

代码语言:javascript
复制
cts:path-range-query('//inner[@a and not(@b)]/@a','>','')

这也使我们能够使用@a有效地回答哪些@b值丢失的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52750613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档