XQuery简单格式错误的查询

时间:2015-05-04 08:09:31

标签: xml xquery

我正在研究一个更大的XQuery,并且在如何获取我需要的数据方面一片空白。我正在努力寻找一个人正在进行的项目的所有工具。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<projects>
    <project pid="p123">
        <leader>
            <name>Amanda</name>
        </leader>
        <analyst>
            <name>Bob</name>
        </analyst>
    </project>
    <project pid="p456">
        <leader>
            <name>John</name>
        </leader>
     </project>
     <project pid="p789">
         <leader>
             <name>David</name>
         </leader>
         <analyst>
             <name>Amanda</name>
         </analyst>
     </project>
</projects>

结果,不是这种格式,Amanda与p123,p789,Bob与p123,John与p456,David与p789。我本周刚刚开始使用XQuery,所以我还不熟悉这种语言。感谢

编辑: 我试图获得的表格是

<workforce>
    <emp roles, name>
        <project>
            <proj>(Project ids go here)</proj>
        </project>
     </emp>
 <workforce>

我可以把它变成这种形式但是我无法获得的部分。我需要将员工与当前的项目联系起来。

1 个答案:

答案 0 :(得分:0)

正如其他人已经指出的那样,最好发布您尝试过的内容,以便我们查看并修复错误。但是,对于一个简单的查询,这里有可能解决您的问题:

let $in :=
   <projects>
      <project pid="p123">
         <leader>
            <name>Amanda</name>
         </leader>
         <analyst>
            <name>Bob</name>
         </analyst>
      </project>
      <project pid="p456">
         <leader>
            <name>John</name>
         </leader>
      </project>
      <project pid="p789">
         <leader>
            <name>David</name>
         </leader>
         <analyst>
            <name>Amanda</name>
         </analyst>
      </project>
   </projects>
for $n in distinct-values($in/project/*/name)
return
   <person name="{ $n }"> {
      for $p in $in/project[*/name = $n]
      return
         <project pid="{ $p/@pid }" position="{ name($p/*[name eq $n]) }"/>
   }
   </person>

这不完全是你所描述的输出,但我无法理解它。评估上述表达式会产生以下结果:

<person name="Amanda">
   <project pid="p123" position="leader"/>
   <project pid="p789" position="analyst"/>
</person>
<person name="Bob">
   <project pid="p123" position="analyst"/>
</person>
<person name="John">
   <project pid="p456" position="leader"/>
</person>
<person name="David">
   <project pid="p789" position="leader"/>
</person>

也就是说,对于每个不同的名称,创建一个person元素,并为名称显示的每个项目创建一个project元素及其PID和当前名称的位置。