不确定如何在XQuery中过滤这个简单的FLWOR查询?

时间:2015-12-05 04:44:36

标签: xml xquery flwor

我老实说我不会对这个简单的查询有很多问题,但是我应该编写一个查询,显示哪些病房与枪支相关的犯罪最多,但我只停留在1-2行代码并继续在XBase中收到此错误:

  

descendant :: ward:预期作为输入的节点

我尝试使用"其中"代替第一个" let",因为我将结果限制为" GUN"犯罪,但后来我得到了这个错误:

  

不完整的FLWOR表达:期待'返回'。

这是我的代码:

  xquery version "1.0";
declare variable $crimes := doc('dc_crime.xml')//crime;


   Query to display total number of gun crimes by ward

<gunCrimes>{

for $ward in distinct-values(doc('dc_crime.xml'))//ward
let $details := $crimes[ward=$ward] 
let $count := count($details)
order by $count descending

return 
<count ward="{$ward}" crimes="{$count}">{$details}</count>
}</gunCrimes>

示例XML剪辑:

 <crime id="13086252">
      <dateTime>2013-06-23T20:02:00</dateTime>
      <month>6-Jun</month>
      <day>1-Sun</day>
      <offense>ASSAULT W/DANGEROUS WEAPON</offense>
      <method>GUN</method>
      <ward>8</ward>
   </crime>
   <crime id="13086254">
      <dateTime>2013-06-23T20:56:00</dateTime>
      <month>6-Jun</month>
      <day>1-Sun</day>
      <offense>THEFT/OTHER</offense>
      <method>OTHERS</method>
      <ward>2</ward>
   </crime>
   <crime id="13086257">
      <dateTime>2013-06-23T20:52:00</dateTime>
      <month>6-Jun</month>
      <day>1-Sun</day>
      <offense>THEFT/OTHER</offense>
      <method>OTHERS</method>
      <ward>7</ward>
   </crime>
   <crime id="13086268">
      <dateTime>2013-06-23T19:54:00</dateTime>
      <month>6-Jun</month>
      <day>1-Sun</day>
      <offense>ROBBERY</offense>
      <method>GUN</method>
      <ward>8</ward>
   </crime>
   <crime id="13086278">
      <dateTime>2013-06-23T21:50:00</dateTime>
      <month>6-Jun</month>
      <day>1-Sun</day>
      <offense>THEFT F/AUTO</offense>
      <method>OTHERS</method>
      <ward>1</ward>
   </crime>

我仍然是XQuery的新手,但有人可以请教我做错了什么吗?非常感谢你。

1 个答案:

答案 0 :(得分:1)

您可以将crime元素限制为谓词表达式中具有子method等于"GUN"的元素,例如:

.....
for $ward in distinct-values(doc('dc_crime.xml')//ward)
(: notice the added `and method='GUN'` in the predicate :)
let $details := $crimes[ward=$ward and method='GUN'] 
let $count := count($details)
order by $count descending
....

或首先过滤全局变量:

declare variable $crimes := doc('dc_crime.xml')//crime[method='GUN'];