Используйте это выражение XPath 2.0 :
for $limit in 2,
$t in /*/Teacher,
$id in $t/@id,
$s in /*/Student/@id,
$numLessons in
count(/*/Lesson[@teacher eq $id
and @student eq $s])
return
if($numLessons gt $limit)
then
(string-join(($t/Name, $s, xs:string($numLessons)), ' '),
'
'
)
else ()
здесь я установил $limit
в 2, чтобы при вычислении этого выражения XPath по отношению к предоставленному документу XML:
<PrivateSchool>
<Teacher id="teacher1">
<Name>teacher1Name</Name>
</Teacher>
<Teacher id="teacher2">
<Name>teacher2Name</Name>
</Teacher>
<Student id="student1">
<Name>student1Name</Name>
</Student>
<Student id="student2">
<Name>student2Name</Name>
</Student>
<Lesson student="student1" teacher="teacher1" />
<Lesson student="student2" teacher="teacher2" />
<Lesson student="student3" teacher="teacher3" />
<Lesson student="student1" teacher="teacher2" />
<Lesson student="student3" teacher="teacher3" />
<Lesson student="student1" teacher="teacher1" />
<Lesson student="student2" teacher="teacher4" />
<Lesson student="student1" teacher="teacher1" />
</PrivateSchool>
это дает правильный результат :
teacher1Name student1 3
В вашем реальном выражении у вас будет $limit
установлен на10
и возвращает только имена учителей :
for $limit in 10,
$t in /*/Teacher,
$id in $t/@id,
$s in /*/Student/@id,
$numLessons in
count(/*/Lesson[@teacher eq $id
and @student eq $s])
return
if($numLessons gt $limit)
then ($t/Name, '
')
else ()