Объедините ссылки, чтобы создать новую ссылку, например ${var${randnum}}.
Я пытаюсь создать новую ссылку, содержащую другую ссылку, как в ${var${randnum}}. В конечном итоге я хочу создать переменную, которая относится к двойному рандомизированному набору переменных. Поскольку описанный выше подход не сработал, я разработал его дальше и получил результат ниже.
В поле расчета я пишу
concat('$','{','trust',${rand_no2},'_' ,${rand_no3_1},'}')
Что должно привести к
${trust1_1}
и соответствующие комбинации.
Без строки 11 (name=ref2) файл компилируется, и я могу запустить его в ODK Collect (v.2.4) на моем телефоне. Однако когда я дохожу до строки 10 (в ODK Collect), я получаю сообщение: «Произошла ошибка Цикл зависимости в s; превышен предел рекурсии !!» (Я включил строку 11, чтобы показать, чем я хочу заниматься в конце.)
Я пишу файл в Excel и компилирую его с помощью ODK xlsform в автономном режиме. (Для тестирования я передаю его по кабелю на свой телефон.)
Файл xls для воспроизведения можно найти здесь:https://forum.getodk.org/t/concatenate-references-to-create-new-reference-var-randnum/34968
Заранее большое спасибо!
1 ответ
Вы смешиваете некоторые вещи, связанные с синтаксисом ${q}, названиями вопросов и значениями вопросов.
Обратите внимание, что ODK Collect на самом деле не понимает синтаксис ${q} (который предназначен только для XLSForm). Полезно взглянуть на фактический формат формы, который понимает собираемый ODK, который называется XForm, формат XML, в который преобразуется XLSForm. Однако, даже если ODK Collect понимает синтаксис ${q}, ваш подход все равно не будет работать, поскольку вы создаете строковое значение для вопроса ref (используя concat). Это не было бы волшебным образом оценено как ссылка / формула. Вы не можете динамически создавать ссылку или формулу.
На данный момент (до тех пор, пока ODK не поддерживает что-то вроде функции local-name()), возможно, лучшим подходом является использование позиции и размещение вычисленных значений внутри группы. Возможно, что-то вроде // group /calc[number(${pos})]. Обратите внимание, что позиции начинаются с 1 (поэтому первый элемент - это позиция 1), и требуется преобразование позиции в число или целое число.