我正在使用cts:element-value-search来根据参数搜索文档。虽然查询工作正常但我希望它只搜索直接子元素中的元素。
对于Ex。我的文档树看起来像这样
document1.xml
<Person>
<FirstName>Johnson</FirstName>
<LastName>W</LastName>
<EmailAddress>[email protected]</EmailAddress>
<Neighbour>
<FirstName>Mathew</FirstName>
<LastName>Long</LastName>
</Neighbour>
</Person>
document2.xml
<Person>
<FirstName>Mathew</FirstName>
<LastName>W</LastName>
<EmailAddress>[email protected]</EmailAddress>
<Neighbour>
<FirstName>Anderson</FirstName>
<LastName>Long</LastName>
</Neighbour>
</Person>
我的查询是
cts:search(
/Person,
cts:and-query((
cts:element-value-query(xs:QName("FirstName"), concat('*', "son", '*'),
("wildcarded", "case-insensitive", "whitespace-sensitive", "punctuation-sensitive"))
)),
()
)
这将返回两个文档,因为第一个文档与<FirstName>Johnson</FirstName>
匹配
并且它匹配的第二个文件
<FirstName>Anderson</FirstName>
这是在较低的水平。
我不想要第二个结果,并希望查询仅在1级搜索。
任何帮助表示赞赏。
您可以使用cts:element-query
和cts:json-property-scope-query
将子查询的范围限定为特定的容器元素或属性。这些将减少与特定祖先的子查询匹配。
然而cts:element-query(xs:QName('Person'), cts:element-value-query(xs:QName('Firstname', ...))
是不够的,因为Neighbour/Firstname
也是后代。
最简单的选择是在Person/Firstname
上使用路径范围索引。这是迄今为止最直接的解决方案。
HTH!