XQuery: если условие внутри двойника для - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь обновить переменную $ numMatches внутри оператора if, внутри double для отслеживания матчей, сыгранных командами, в XML-документе. Код вызывает ошибку.

Псевдог логика:

«Для каждой команды в командах, для каждого сыгранного матча, если идентификатор команды равен местному игроку или игроку-посетителю, добавить 1 к числу матчей, сыгранных этой командой».

XQuery, который я пробовал:

<resumen>    
{ for $teams in ligue/teams/team

    let $numMatches := 0

    for $matches in ligue/match_results/match

        if ($teams/team_id = $matches/local) or ($teams/team_id = 
        $matches/visitor) then

        $numMatches := $numMatches + 1

    return <teamAndMatches>{$teams/name/data()}-{$numMatches}</teamAndMatches>   
}
</resumen>

Там есть ошибка, поскольку XBase говорит, что ожидает возврата. Где ошибка? Я новичок в этом языке. Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Существует функция count, поэтому для этого достаточно

<resumen>    
{ for $teams in ligue/teams/team

    return <teamAndMatches>{$teams/name/data()}-{count(ligue/match_results/match[local = $teams/team_id or visitor = $teams/team_id])}</teamAndMatches>   
}
</resumen>

.

2 голосов
/ 09 мая 2019

XQuery (XML Query) - это язык запросов и функционального программирования, который запрашивает и преобразует коллекции структурированных и неструктурированных данных, обычно в форме XML, текста и с расширениями, специфичными для поставщика, для других форматов данных (JSON,двоичный файл и т. д.).

, приведенный в статье WikiPedia XQuery .

XQuery - это функциональный язык программирования, в котором переменные неизменны.

цитата из этого SO ответа .

Таким образом, вы не можете обновить свою переменную следующим образом

$numMatches := $numMatches + 1

, поскольку переменная является неизменной.
Вы думали из императивной парадигмы, которая здесь не применима.

Если вы хотите решить эту загадку, попробуйте подумать о функциональной парадигме и перепрограммировать эту функцию рекурсивно (что, вероятно, означает передачу счетчиков в качестве параметров рекурсивной функции).

...