实时 XFA SOM 路径解析

启用 EnableJavaScript 的一般执行会向节点级 resolveNode/resolveNodes、xfa.resolveNode/xfa.resolveNodes 以及 FormCalc 访问器提供同一套实时表单解析器

实例插入、删除或移动之后,解析立即跟随当前的重复 occurrence;成功的运行时事务把选定的字段写入持久化到其原生数据目标以及保存的 XDP

路径与 occurrence

路径选择结果
row[1].cell第二行及其选定的 cell
row[*].cell每一行中被选定的 cell
$form.main.row.cell通过绝对路径选择第一行第一列
row[-1].cell推断 occurrence 之前的行
row[+1].cell推断 occurrence 之后的行
main..cell[*]第一个后代分支中匹配的同级 cell
main.*按文档顺序的所有直接子节点
main.#field[name='target']由命名属性谓词选定的字段
main.#subform[*].#field每个 subform 下按类名匹配的选定字段
main.part\.name节点名中含转义句点的 JavaScript 解析器路径

省略索引选择一个 occurrence;绝对路径使用 occurrence 零,而有作用域的路径在结构存在重复同级时会借用对应祖先或容器的索引

即使源节点和目标节点名字不同,索引推断仍沿对应的层级进行;类选择器借用对应的类 occurrence 索引

只出现一次的目标无需调用方提供 occurrence 索引即可选中;推断 occurrence 缺失时返回空列表或 null,而不是悄悄选中另一个作用域

相对索引是相对未加修饰的推断 occurrence 的偏移,在绝对路径中无效;FormCalc 索引表达式可以在运行时计算 occurrence

未命名容器对命名子节点查找是透明的;父级限定以及 rawValue、name、className、index、presence、access 等受支持属性均可用,脚本对象的词法导出也可以通过 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 字符串传入

后代查找按文档顺序搜索满足剩余路径组件的分支;某个分支没有匹配后缀时不会掩盖后面出现的完整匹配

occurrence 索引只在其匹配的同级组内有效;越界索引会终止该次后代搜索,因此当第一行只有一个 cell 时,main..cell[1] 不会选中其他行的 cell

前置通配符对每个被选中的上下文独立执行后代查找,绝对根节点之后紧跟的通配符选择根的子节点

JavaScript 谓词会收到当前事件的 xfa 与 event 对象;候选相关查找、谓词异常和原生写入共享外层事务

嵌套 Eval 继承谓词候选节点,使用隔离的计算变量和函数,并与外层事件共享原生编译响应和事务重放

Exists(missing) 以及访问不存在的索引 occurrence 会通过 Exists 返回 0;普通使用未解析的 FormCalc 对象会引发错误

预算与迁移

路径最多允许 128 个组件和 65,536 个 UTF-16 code unit;索引必须是安全整数,遍历、谓词、动态编译和实例操作共享事件执行预算

解析器错误、谓词异常和超出预算都会中止事件,并通过 TXFAWidgetRuntime 恢复原生字段值、实例顺序和脚本状态

早期的一般执行 resolveNodes 会把省略的索引扩展到所有重复祖先;当本意是每行每列时,请用 main.row[*].cell[*] 替换 main.row.cell[*]

覆盖范围

解析器作用于事件绑定提供的实时表单对象,包括字段、subform、draw、exclusion group、area 和脚本对象,通过 $data 与 $record 暴露的 原生 Data DOM,以及带生效属性的已声明 模板属性节点

resolver 字符串支持 JavaScript 名称转义;FormCalc 源码标识符沿用编译器的标识符文法

相关 API

HPDFXFACompileFormCalcEvent、HPDFXFAExecuteJavaScriptEvent、Dynamic Eval、FormCalc References 与 Interactive XFA Runtime