Рассчитайте и обновите оценку в соответствии с выбранным ответом
Я новичок в ODK и XLSForms.
У меня есть несколько вопросов, и на основании ответов мне нужно рассчитать балл.
У меня 17 вопросов, каждый раз, когда человек отвечает да, мне нужно добавить 2 балла в целочисленное поле.
Так что я:
type name label appearnce required
select_one yes_no1 q1 //question here //appearance quick //required yes
...
select_one yes_no17 q17 ...
А вот поле оценки:
type name label
calculate total Total
Это мое первое задание в моей работе, и я не могу понять, как рассчитать и изменить значение в соответствии с выбранным ответом.
РЕДАКТИРОВАТЬ
Я добавил выражение для вычисления, но не знаю, как получить результат, потому что он не сработал:
if ((${q8} = 'yes' or ${q9} ='yes' or ${q11}='yes'), 2, 0)
Поэтому, если на вопросы 8, 9 или 11 ответили "да", добавьте 2 балла к текущему значению, но поле вообще не появилось. И все же нужно добавить, если на вопросы 10, 12, 13 и 14 ответили "да", чтобы добавить 1 балл за каждый.
1 ответ
Простой, но утомительный способ сделать это - создать вычисление для каждого вопроса с помощью оператора if(), который устанавливает вычисленное значение равным 2 или 0. Окончательный результат можно получить, сложив вычисленные элементы.
Классный способ сделать это - сделать все это в одном выражении XPath. По сути, вы хотите создать набор узлов, который содержит все 17 вопросов, отфильтровать их к тем со значением "да", сосчитать отфильтрованный набор узлов и умножить на 2. Вы можете сделать это в XLSForm, но я не уверен, что вы можете использовать $ Сокращение {узел}.
Вы должны поместить все свои вопросы в группу (без метки группы), после чего вы можете сделать что-то вроде:
count(${grp}/*[text() = 'yes']) * 2
или без ярлыка ${node} (проверьте правильность пути в XForm):
count(/myform/grp/*[text() = 'yes']) * 2
Я не уверен, что использование text() пройдет ODK Validate, хотя. Если нет, то, вероятно, есть выражение, которое пройдет и сделает то же самое. (Тем не менее, приведенный выше синтаксис будет работать в Enketo).