xquery - and-query 匹配一个属性值和一个子元素值
问题描述
我有包含以下结构的文档:
<Reviews>
<Review complete="false">
<StartDate>2019-03-05T06:00:00Z</StartDate>
<EndDate>2019-03-12T05:00:00Z</EndDate>
<Reviewers>
<Reviewer userName="jdoe">
<ReviewStatus>Completed</ReviewStatus>
</Reviewer>
</Reviewers>
</Review>
<Review complete="false">
<StartDate>2019-03-06T06:00:00Z</StartDate>
<EndDate>2019-03-13T05:00:00Z</EndDate>
<Reviewers>
<Reviewer userName="jsmith">
<ReviewStatus>Pending</ReviewStatus>
</Reviewer>
<Reviewer userName="jdoe">
<ReviewStatus>Completed</ReviewStatus>
</Reviewer>
</Reviewers>
</Review>
</Reviews>
使用 MarkLogic XQuery,我想搜索具有 jsmith 的 Reviewer 元素并且他的ReviewStatus=Completed 的文档。即,我不想在我的结果中看到上面的这个示例,因为 jsmith 的 ReviewStatus 没有完成。我尝试了几种不同的查询类型,其中cts:and-query()
使用属性值、元素词甚至路径范围查询的组合。但我还没有想出如何只找到那些包含 Reviewer 元素的文档,其中 userName 属性值与“jsmith”匹配,并且 ReviewStatus 子元素值与同一 Reviewer 元素中的“Completed”匹配。任何人都可以为此提出一种方法吗?
解决方案
您正在寻找范围查询,例如cts:element-query
. 它允许您为子查询选择一个联合祖先。这里有一些代码显示了它是如何工作的:
let $search-name := "jsmith"
let $search-status := "Completed"
let $xml := <Reviews>
<Review complete="false">
<StartDate>2019-03-05T06:00:00Z</StartDate>
<EndDate>2019-03-12T05:00:00Z</EndDate>
<Reviewers>
<Reviewer userName="jsmith">
<ReviewStatus>Completed</ReviewStatus>
</Reviewer>
<Reviewer userName="jdoe">
<ReviewStatus>Pending</ReviewStatus>
</Reviewer>
</Reviewers>
</Review>
<Review complete="false">
<StartDate>2019-03-06T06:00:00Z</StartDate>
<EndDate>2019-03-13T05:00:00Z</EndDate>
<Reviewers>
<Reviewer userName="jsmith">
<ReviewStatus>Pending</ReviewStatus>
</Reviewer>
<Reviewer userName="jdoe">
<ReviewStatus>Completed</ReviewStatus>
</Reviewer>
</Reviewers>
</Review>
</Reviews>
for $rev in $xml//Reviewer
where cts:contains(
$rev,
cts:element-query(
xs:QName("Reviewer"),
cts:and-query((
cts:element-attribute-value-query(xs:QName("Reviewer"), xs:QName("userName"), $search-name),
cts:element-value-query(xs:QName("ReviewStatus"), $search-status)
))
)
)
return $rev
请注意,如果您需要未过滤搜索的准确结果,则需要启用位置索引。
!
推荐阅读
- vue.js - 在 vue js 中将类作为道具传递?
- android-layout - SwitchCompat 文本未显示在操作栏上
- schedule - 在套件脚本 2.0 中找不到函数 setValue?
- javascript - Sapper 不导出 *.json.js 文件
- android - 添加firebase性能依赖后Gradle依赖冲突
- java - 在不使用 apache CompareToBuilder 的情况下实现我自己的 compareTo()
- jenkins - 如何在 Jenkins 的控制台输出中提取错误?
- javascript - 将组件传递给 useState() 钩子
- python - 函数调用子函数满足条件
- python - Python 函数调用 vs 数据库查询(django ORM)开销