2017-04-14 65 views
2

我遇到了XQuery的问题。逻辑:如何使用XQUERY显示消除重复的项目?

获取以“Manuel”开头的所有教师的姓名,消除每个教师班级的重复并指示所有教室。按名称排序从最短到最长。

我已经做到了这一点:

for $x in (doc("LMSGI06")//course[starts-with(teacher, "Manuel")]) 
    order by string-length($x/teacher) 
     return 
      <teacher> 
       <name>{data(distinct-values($x/teacher))}</name> 
       <classroom>{data($x/classroom)}</classroom> 
      </teacher>` 

这是我的查询结果:

<teacher> 
    <name>Manuel Gómez</name> 
    <classroom>2</classroom> 
</teacher> 
<teacher> 
    <name>Manuel Gómez</name> 
    <classroom>3</classroom> 
</teacher> 
<teacher> 
    <name>Manuela Berenguel</name> 
    <classroom>1</classroom> 
</teacher> 
<teacher> 
    <name>Manuel Antonio López</name> 
    <classroom>1</classroom> 
</teacher> 

的XML的结构是这样的:

<shop> 
    <education> 
     <course id="1"> 
      <teacher>Manuela Berenguel</teacher> 
      <classroom>1</classroom> 
     </course> 
    </education> 
</shop> 

我需要曼努埃尔戈麦斯只出现一次,但我不知道如何。我正在使用distinct-values(),但它不起作用。有人能帮助我吗?

+0

您是否期望ManuelGómez教室具有“2”或值“3”或“2,3”或多个课堂元素的价值? –

回答

1

distinct-values()对当前脚本没有帮助,因为您正在将其应用于每个教师姓名,因为您正在生成该元素。因此,一次只有一个值,distinct-values()返回正在处理的当前值。

为了避免重复名称,您希望将distinct-values()应用于所有教师元素值。然后,您需要决定如何在输出中表示多个教室值。如果该教师有多个课程,以下内容会产生多个课堂元素。

let $manuel-courses := doc("LMSGI06")//course[starts-with(teacher, "Manuel")] 
for $teacher in distinct-values($manuel-courses/teacher) 
order by string-length($teacher) 
return 
    <teacher> 
    <name>{data($teacher))}</name> 
    {$manuel-courses[teacher = $teacher]/classroom)} 
    </teacher>` 
+0

非常感谢你!它的工作完美!现在我更了解它。再次感谢! @Mads Hansen – user7753413