如何比较同一节点Xquery上的属性



我遇到了一个问题,试图比较和计算同一节点的属性,例如,我需要过滤那天多次操作一次以上的医生。我的示例xml是:

<ops>
  <med_operation pac="p1" doctor="David" date="2017-01-01" />
  <med_operation pac="p2" doctor="David" date="2017-01-01" />
  <med_operation pac="p3" doctor="Ana" date="2017-01-02" />
</ops>

我只需要展示"大卫"是唯一在同一天进行两项操作的人。我得到了这个糟糕的查询

let $m := distinct-values(
   let $dates := //med_operation/@date
   for $d in $dates
   let $ope := //med_operation[@date=$d]
   let $c := count(//med_operation[@date=$d])
   for $y in (1 to $c)
   where ($ope[$y]/@date) = ($ope[$y+1]/@date) and $c > 1
   return distinct-values($ope/@doctor)
   )
return $m

提前感谢,对不起,我的英语

有多种解决这个问题的方法,但是一个直接的解决方案是循环循环医生名称的不同值,然后循环循环,绕过该医生的不同日期值,计数那些匹配的日期并将它们存储为序列,然后最终将使用where的结果集约束至仅在该序列中具有值大于一个序列的医生。

for $doc in distinct-values(//med_operation/@doctor)
let $date-counts :=
  for $date in distinct-values(//med_operation[@doctor = $doc]/@date)
  return count(//med_operation[@doctor = $doc][@date= $date])
where ($date-counts[. gt 1])
return $doc

在xquery 3.0中,使用:

for $o in //med_operation
group by $doc := $o/@doctor, $date := $o/@date
where count($o) gt 1
return $doc

最新更新