如何在XQuery中使用distinct-values()获取所有未分组的项目?

时间:2016-04-28 13:04:52

标签: xml xpath xquery

使用此XQuery表达式

for $ex in distinct-values(//products/product/@group)
return $ex

和这个XML

<xml>
    <products>
        <product id="10" group="2"></product>
        <product id="20" group="1"></product>
        <product id="25" group=""></product>
        <product id="30" group="2"></product>
        <product id="35" group=""></product>
    </products>
</xml>

我只得到:

  • 产品组&#39; 2&#39;
  • 产品组&#39; 1&#39;

但我也需要:

  • 产品组&#39;&#39; (@ ID = 25)
  • 产品组&#39;&#39; (@ ID = 35)

期待(订单不感兴趣):

一组中只有一种产品(第一种,如果超过1只有同一组),而且每种产品都没有组。

  • 产品ID 10与组&#39; 2&#39;
  • 产品ID 20与组&#39; 1&#39;
  • 产品ID 35与组&#39;&#39;
  • 产品ID 25与组&#39;&#39;

每个带有空组的产品也应该在此xquery中返回,但是如何?

2 个答案:

答案 0 :(得分:2)

空字符串也是一个不同的值,应该已经返回,但很可能你根本就没有观察到它。将您的查询更改为

for $ex in distinct-values(//products/product/@group)
return <value>{ $ex }</value>

你会得到像

这样的结果
<value>2</value>
<value>1</value>
<value/>

<value/>相当于<value></value>,“包含”空字符串。)

如果您希望将单个产品与空组和所有没有组的产品匹配,您可以将查询拆分为两部分:对具有组的产品进行过滤,然后添加不具有组的产品。

(
  (: return first product for each product group :)
  for $group in distinct-values(//products/product/@group)
  (: unless group is empty :)
  where $group
  return (//product[@group eq $group])[1],
  (: add products without any group :)
  //product[@group eq '']
)

答案 1 :(得分:1)

Xpath 1.0能够在没有任何程序代码的情况下找到这些元素

//product[
  not(@group = preceding-sibling::product/@group) 
  or (@group="")
  ]