라이브 XFA SOM 경로 해석
EnableJavaScript가 켜진 일반 실행은 노드 수준 resolveNode/resolveNodes, xfa.resolveNode/xfa.resolveNodes, FormCalc 접근자에 동일한 라이브 폼 리졸버를 공급합니다
인스턴스를 삽입·제거·이동하면 해석이 곧바로 현재 반복 occurrence를 따라갑니다. 성공한 런타임 트랜잭션은 선택된 field 쓰기를 원본 데이터 대상과 저장된 XDP에 유지합니다
경로와 occurrence
| 경로 | 선택 결과 |
|---|---|
row[1].cell | 두 번째 행과 그 행에서 선택된 cell |
row[*].cell | 모든 행에서 선택된 cell |
$form.main.row.cell | 절대 경로로 첫 번째 행과 첫 번째 cell |
row[-1].cell | 추론된 occurrence 앞의 행 |
row[+1].cell | 추론된 occurrence 뒤의 행 |
main..cell[*] | 첫 번째 자손 브랜치에서 일치하는 형제 cell |
main.* | 문서 순서대로 모든 직계 자식 |
main.#field[name='target'] | 이름 프로퍼티 predicate로 선택된 field |
main.#subform[*].#field | 클래스 이름이 일치하는 각 subform 아래의 선택된 field |
main.part\.name | 노드 이름에 이스케이프된 마침표가 들어간 JavaScript 리졸버 경로 |
인덱스를 생략하면 occurrence 하나를 선택합니다. 절대 경로는 occurrence 0을 쓰고, 스코프가 있는 경로는 구조에 반복 형제가 있을 때 대응하는 조상이나 컨테이너 인덱스를 빌려 씁니다
인덱스 추론은 소스와 대상 노드 이름이 달라도 대응하는 계층 수준을 따라갑니다. 클래스 셀렉터는 대응하는 클래스 occurrence 인덱스를 빌려 씁니다
하나만 있는 대상은 호출자가 occurrence 인덱스를 넘기지 않아도 선택됩니다. 추론된 occurrence가 없으면 다른 scope를 조용히 고르는 대신 빈 리스트나 null을 반환합니다
상대 인덱스는 접미사 없는 추론 occurrence 기준 오프셋이며 절대 경로에서는 유효하지 않습니다. FormCalc 인덱스 식으로는 런타임에 occurrence를 계산할 수 있습니다
이름 없는 컨테이너는 이름 있는 자식 조회에 투명합니다. 부모 한정자와 rawValue, name, className, index, presence, access 같은 지원 프로퍼티를 쓸 수 있고, 스크립트 객체의 렉시컬 export는 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 predicate는 .(expression)을 쓰며 후보를 this로 실행합니다. FormCalc predicate는 .[expression]을 쓰고 그 후보 기준으로 상대 field를 해석합니다
predicate는 [*]를 생략해도 일치하는 형제를 선택합니다. JavaScript predicate는 후보 scope 안의 맨이름 field도 해석하고, FormCalc 소스의 predicate 경로는 따옴표로 묶인 리졸버 문자열로 넘겨야 합니다
자손 조회는 남은 경로 구성 요소를 만족하는 브랜치를 문서 순서대로 찾습니다. 접미사가 맞지 않는 브랜치가 뒤의 완전한 매치를 가리지는 않습니다
occurrence 인덱스는 자신이 속한 형제 그룹 안에서만 유효합니다. 범위를 벗어난 인덱스는 그 자손 탐색을 끝내므로, 첫 행에 cell이 하나뿐이면 main..cell[1]이 다른 행의 cell을 선택하지 않습니다
앞에 놓인 와일드카드는 선택된 컨텍스트마다 자손 조회를 독립적으로 평가하고, 절대 루트 바로 뒤의 와일드카드는 루트의 자식들을 선택합니다
JavaScript predicate는 현재 이벤트의 xfa와 event 객체를 받습니다. 후보 기준 조회, predicate 예외, 네이티브 쓰기는 둘러싼 트랜잭션을 공유합니다
중첩 Eval은 predicate 후보를 상속하고 고립된 계산 변수와 함수를 쓰며, 네이티브 컴파일 응답과 트랜잭션 리플레이는 둘러싼 이벤트와 공유합니다
Exists(missing)과 존재하지 않는 인덱스 occurrence에 대한 접근은 Exists로 0을 반환합니다. 해석되지 않은 FormCalc 객체를 평범하게 쓰면 오류가 납니다
예산과 마이그레이션
경로는 최대 128개 구성 요소와 65,536 UTF-16 코드 유닛까지 허용합니다. 인덱스는 safe integer여야 하고, 순회, predicate, 동적 컴파일, 인스턴스 연산은 이벤트 실행 예산을 공유합니다
파서 오류, predicate 예외, 예산 초과는 이벤트를 중단하고 TXFAWidgetRuntime을 통해 네이티브 field 값, 인스턴스 순서, 스크립트 상태를 복원합니다
이전 범용 resolveNodes는 생략된 인덱스를 반복 조상 전체에 걸쳐 확장했습니다. 모든 행과 모든 cell이 의도라면 main.row.cell[*] 대신 main.row[*].cell[*]을 쓰세요
적용 범위
리졸버는 이벤트 바인딩이 공급하는 라이브 폼 객체, 즉 field, subform, draw, exclusion group, area, 스크립트 객체, $data와 $record로 노출되는 네이티브 Data DOM, 유효 속성을 가진 선언된 템플릿 프로퍼티 노드에 동작합니다
리졸버 문자열은 JavaScript 이름 이스케이프를 지원합니다. FormCalc 소스 식별자는 컴파일러의 식별자 문법을 그대로 따릅니다
관련 API
HPDFXFACompileFormCalcEvent, HPDFXFAExecuteJavaScriptEvent, 동적 Eval, FormCalc 참조, 인터랙티브 XFA 런타임