2017-04-14 6 views
2

XQuery에 문제가 있습니다. 논리 :XQUERY로 반복을 제거하는 항목을 어떻게 표시 할 수 있습니까?

"Manuel"로 시작하는 모든 선생님들의 이름을 얻으십시오. 반복을 생략하고 각 선생님 반의 모든 강의실을 나타냅니다. 가장 짧은 것부터 가장 긴 것까지 이름순으로 정렬하십시오.

<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> 

내가 마누엘이 필요

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>` 

이 내 쿼리의 결과입니다

나는이 짓을 고메즈 한 번만 나타나지만 어떻게 모르겠어. 나는 distinct-values()을 사용하고 있지만 작동하지 않습니다. 누군가 나를 도울 수 있습니까?

+0

Manuel Gomez 교실의 값이 "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