我正在寻找一个搜索例程,为我提供元素Brand的所有唯一值的列表,其属性为'Heineken'。所以在这种情况下;可以,箱子。
我尝试这样做:
let $query := cts:element-attribute-values(xs:QName("p:brand"), xs:QName("name"), 'Heineken')
for $temp in cts:search(fn:doc(), (cts:query($query)))
return fn:distinct-values($temp)
为此,我在品牌/名称上创建:范围元素属性索引。
我的最终目标是使用Heineken / Can为每个文档创建Merlot的唯一值列表。在下面的例子中;玻璃
saturday.xml
<thedrinksihad>
<brand name='Heineken'>Can</brand>
<brand name='Grolsch'>Bottle</brand>
<brand name='Merlot'>Glass</brand>
</thedrinksihad>
sunday.xml
<thedrinksihad>
<brand name='Heineken'>Crate</brand>
<brand name='Grolsch'>Can</brand>
<brand name='Merlot'>Bottle</brand>
</thedrinksihad>
答案 0 :(得分:2)
可能有几种方法可以做到这一点,但由于你开始使用范围索引,这个答案将使用它们。您需要xs:QName('p:brand')
上的其他范围索引。
此查询将返回包含<brand name='Heineken'>Can</brand>
和任何<brand name='Merlot'>
的所有文档。然后,它会过滤输出以仅选择Merlot
品牌并获取该序列的distinct-values
:
let $merlots :=
cts:search(//p:thedrinksihad,
cts:and-query((
cts:element-query(xs:QName('p:brand'),
cts:element-attribute-range-query(xs:QName("p:brand"), xs:QName("name"), '=', 'Merlot')),
cts:element-query(xs:QName('p:brand'),
cts:and-query((
cts:element-attribute-range-query(xs:QName("p:brand"), xs:QName("name"), '=', 'Heineken'),
cts:element-range-query(xs:QName("p:brand"), '=', 'can'))))
))
)/p:thedrinksihad/p:brand[@name eq 'Merlot']
return distinct-values($merlots)
请注意cts:*-values
函数可能很棘手。这种情况看起来似乎很理想,因为它们只返回不同的值。但是,传递给cts:*-values
函数的查询运行&#34;未过滤&#34;,这意味着它将返回任何匹配片段的所有值。在这种情况下,这意味着匹配文档中的所有<brand>
值,包括<brand name='Merlot'>
以外的值。