CTS-搜索特定属性的唯一元素值

时间:2014-04-29 17:39:51

标签: xquery marklogic

我正在寻找一个搜索例程,为我提供元素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>

1 个答案:

答案 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'>以外的值。