如何找到没有。员工部门明智吗?

时间:2017-05-13 05:41:32

标签: xml xpath xquery marklogic marklogic-8

假设我有n个文档,其文档结构如下所示 -

<employee>  <name/>     <dob/>  .....   <dept>dept1</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept11</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept12</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dep13</dept> </employee>  
<employee>  <name/>     <dob/>  .....   <dept>dep1n</dept> </employee>  

<employee>  <name/>     <dob/>  .....   <dept>dept2</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept21</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept22</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>dept23</dept> </employee>  
<employee>  <name/>     <dob/>  .....   <dept>dept2n</dept> </employee>  

<employee>  <name/>     <dob/>  .....   <dept>deptn</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>deptn1</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>deptn2</dept> </employee>
<employee>  <name/>     <dob/>  .....   <dept>deptn3</dept> </employee>  
<employee>  <name/>     <dob/>  .....   <dept>deptnn</dept> </employee>  

dept1是父母。即所有名称如dept11,dept12,dept13 ...的dept是dept1的子集。类似dept2是父级,所有名称如dept21,dept22,dept23的部门都是dept2的子集。
我想找到属于主要部门的员工名单,即属于dept1,dept11,dept12&amp;依此类推,在XqueryMarklogic API的帮助下 希望大家都明白这个问题。

2 个答案:

答案 0 :(得分:3)

可以更好地扩展的解决方案将使用dept上的范围索引,使用cts:values进行词典查找,以获得dept的唯一值及其频率。然后是一个普通的循环,通过值与父部门汇总频率。也许是这样的事情:

let $aggregates := map:map()
let $_ :=
  for $dept in cts:values(cts:element-reference(xs:QName("dept")))
  let $freq := cts:frequency($dept)
  let $parent := substring($dept, 1, 5)
  return map:put($aggregates, $parent, (map:get($aggregates, $parent), 0)[1] + $freq)
return $aggregates

为了使它更容易,您可以考虑通过将XML更改为以下内容来使父部门明确:

<dept>dept1</dept><sub-dept>dept11</sub-dept>

这样cts:values上的dept会立即给出顶级部门的准确频率计数,cts:values上的sub-dept会给出相同的-departments。

HTH!

答案 1 :(得分:0)

现在我找到了解决方案。我相信,可以有更好的方法来实现这一目标。

function senden(form){
 var formData = new FormData(form);
 var xhr = new XMLHttpRequest();
 xhr.open('POST', 'http://188.166.165.74:13337/api/players', true);
 xhr.responseType = 'json';
 xhr.onreadystatechange = function() {
  alert("Daten wurden erfolgreich uebermittelt")
 };
 xhr.send(formData);
}

结果就像例如 -

let $result := for $x in /doc/employee/dept[fn:starts-with(., "dept")] order by $x descending
                return $x
let $max := fn:codepoints-to-string(fn:string-to-codepoints($result[1])[5])
let $res := for $x in (1 to xs:integer($max))
              let $count := fn:count(/doc/employee/dept[fn:starts-with(., fn:concat("dept",xs:string($x)))])
              return (<doc><dept>dept{$x}</dept><count>{$count}</count></doc>)
return $res