2017-04-14 28 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