Динамическое разрешение 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