Динамическое разрешение SOM-путей XFA
Общее выполнение с EnableJavaScript даёт один и тот же resolver живой формы и node-level resolveNode/resolveNodes, xfa.resolveNode/xfa.resolveNodes, и accessor'ам FormCalc
Разрешение сразу учитывает текущие повторяющиеся вхождения после вставки, удаления или перемещения экземпляра; успешные транзакции рантайма сохраняют выбранные записи полей в их родные цели данных и в сохраняемый XDP
Пути и вхождения
| Путь | Выбор |
|---|---|
row[1].cell | Вторая строка и её выбранная ячейка |
row[*].cell | Выбранная ячейка в каждой строке |
$form.main.row.cell | Первая строка и первая ячейка через абсолютный путь |
row[-1].cell | Строка перед выведенным вхождением |
row[+1].cell | Строка после выведенного вхождения |
main..cell[*] | Совпадающие соседние ячейки в первой ветке потомков |
main.* | Все прямые дети в порядке документа |
main.#field[name='target'] | Поля, выбранные предикатом по свойству имени |
main.#subform[*].#field | Выбранное поле под каждым subform с совпадающими именами классов |
main.part\.name | Путь resolver'а JavaScript с экранированной точкой в имени узла |
Опущенный индекс выбирает одно вхождение; абсолютный путь использует вхождение ноль, а scoped-путь заимствует соответствующий индекс предка или контейнера, когда в структурах есть повторяющиеся соседи
Вывод индекса идёт по соответствующим уровням иерархии, даже когда исходный и целевой узлы называются по-разному; селекторы классов заимствуют соответствующий индекс вхождения класса
Цель с единственным вхождением выбирается без требования индекса вхождения от вызывающего; отсутствующее выведенное вхождение возвращает пустой список или null вместо тихого выбора другой области видимости
Относительные индексы — смещения от простого выведенного вхождения, и в абсолютных путях они недопустимы; индексные выражения FormCalc могут вычислить вхождение во время выполнения
Безымянные контейнеры прозрачны для поиска именованных детей; доступны квалификация родителя и поддерживаемые свойства вроде rawValue, name, className, index, presence и access, а лексические экспорты script-object можно разрешать и присваивать через пути FormCalc
Условия
const rows = xfa.resolveNodes("main.row[*].(Number(this.cell.rawValue)>15)");
const selected = xfa.resolveNodes("main.row[*].[cell ge 20].cell");
target = Sum($.resolveNodes("row.[cell ge 20].cell"))
row[1].cell = 25
var p = Ref(row[1].cell)
p = 30
Предикаты JavaScript используют .(expression) и выполняются с кандидатом в роли this; предикаты FormCalc используют .[expression] и разрешают относительные поля относительно того же кандидата
Предикат выбирает совпадающих соседей, даже когда [*] опущен; предикаты JavaScript также разрешают «голые» имена полей в области кандидата, а пути-предикаты в исходнике FormCalc нужно передавать как resolver-строки в кавычках
Поиск по потомкам идёт в порядке документа и ищет ветку, удовлетворяющую оставшимся компонентам пути; ветка без совпадающего суффикса не скрывает полное совпадение дальше
Индекс вхождения локален для своей группы совпадающих соседей; выходящий за диапазон индекс завершает этот поиск по потомкам, поэтому main..cell[1] не выберет ячейку в другой строке, когда в первой строке только одна ячейка
Стоящий перед ним wildcard вычисляет поиск по потомкам независимо для каждого выбранного контекста, а wildcard сразу после абсолютного корня выбирает детей корня
Предикаты JavaScript получают объекты xfa и event текущего события; поиск относительно кандидата, исключения в предикатах и нативные записи разделяют объемлющую транзакцию
Вложенный Eval наследует кандидата предиката, использует изолированные переменные и функции вычислений и разделяет с объемлющим событием ответы нативной компиляции и транзакционный replay
Exists(missing) и accessor к несуществующему индексированному вхождению возвращают 0 через Exists; обычное использование неразрешённого объекта FormCalc приводит к ошибке
Бюджеты и миграция
Пути допускают не более 128 компонентов и 65 536 кодовых единиц UTF-16; индексы должны быть safe integers, а обход, предикаты, динамическая компиляция и операции с экземплярами делят бюджеты выполнения события
Ошибки парсера, исключения предикатов и исчерпанные бюджеты прерывают событие и через TXFAWidgetRuntime восстанавливают нативные значения полей, порядок экземпляров и состояние скриптов
Раньше общий resolveNodes разворачивал опущенные индексы по всем повторяющимся предкам; когда нужны все строки и все ячейки, используйте main.row[*].cell[*] вместо main.row.cell[*]
Покрытие
Resolver работает с живыми объектами формы, которые предоставляют привязки события: поля, subform, draws, exclusion groups, areas и script objects, нативный Data DOM, доступный через $data и $record, и объявленные узлы свойств шаблона с эффективными атрибутами
Экранирование имён JavaScript поддерживается в resolver-строках; идентификаторы в исходнике FormCalc следуют грамматике идентификаторов компилятора
Связанные API
HPDFXFACompileFormCalcEvent, HPDFXFAExecuteJavaScriptEvent, Динамический Eval, Ссылки FormCalc и Интерактивный XFA Runtime