Использование MarkLogic для подсчета - PullRequest
1 голос
/ 12 октября 2019

Я новичок в области MarkLogic и мне нужна помощь в решении этого вопроса с разъяснениями, пожалуйста. Это пример классов XML. Мне нужна функция для подсчета количества уроков, которые посещает студент, используйте карту

<Classes>
   <Class>
      <Class-name>math</Class-name>
      <Student-name>Jon</Student-name>
      <Student-name>Sam</Student-name>
   </Class>
   <Class>
     <Class-name>Sciences</Class-name>
     <Student-name>Jon</Student-name>
     <Student-name>Jack</Student-name>
     <Student-name>Nay</Student-name>
   </Class>
   <Class>
     <Class-name>Languages</Class-name>
     <Student-name>Jon</Student-name>
     <Student-name>Sam</Student-name>
     <Student-name>Nay</Student-name>
   </Class>
</Classes>

1 Ответ

2 голосов
/ 12 октября 2019

Способ подсчета без карт будет состоять в том, чтобы собрать отдельный список Student-name, а затем использовать эти имена, чтобы получить счетчик Student-name элементов с этими именами:

for $student in fn:distinct-values($Classes/Class/Student-name)
return 
  $student||":"||count($Classes/Class[Student-name=$student])

Aспособ добиться того же с картами - это пройтись по каждому из элементов Student-name, поместив на карту запись, увеличивающую текущий счет на 1:

let $stats := map:new()
let $_ := 
  for $student in $Classes/Class/Student-name
  return map:put($stats, $student, 1 + (map:get($stats, $student), 0)[1])
return
  map:keys($stats) ! ( .||":"||map:get($stats, .) )
...