2015-05-04 67 views
-2

我正在研究一个更大的XQuery,并且在如何获得我需要的数据方面拉了一个空白。我正在尝试查找一个人正在处理的项目的所有pid。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> 

这样的结果,而不是在这种格式,是阿曼达要与P123,P789,鲍勃P123,约翰与P456,和大卫P789。本周我刚刚开始使用XQuery,因此我对这种语言仍然很陌生。由于

编辑: 我试图让形式是

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

我可以让它进入这个形式,但我不能得到的部分。我需要将员工与当前的项目联系起来。

+0

请显示你到目前为止的内容,并解释你卡在哪里。 (否则这个问题是关于这个问题的,因为这个问题通常在这里对此不以为然。) – Tomalak

+0

为了清楚起见,编辑它,我知道它并不是非常清楚。 –

+2

问题不是你没有清楚(虽然添加所需的输出是一件好事)。问题在于你的问题并不表明你实际上试图自己解决这个问题,而是你正在寻找可以简单复制和粘贴的代码。 – Tomalak

回答

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元件,以及该名称将出现在每个项目中,创建与它的PID一个project元件和的位置当前名称。