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

マヌエル・ゴメスの教室の値が「2」か「3」か「2,3」か、複数の教室の要素があると思いますか? –

答えて

1

distinct-values()は、要素を生成する際に個々の教師名に適用するため、現在のスクリプトでは役に立ちません。したがって、一度に1つの値しかなく、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

関連する問題