Résolution dynamique des chemins SOM XFA

L'exécution générale avec EnableJavaScript fournit le même résolveur de formulaire dynamique aux resolveNode/resolveNodes au niveau des nœuds, aux xfa.resolveNode/xfa.resolveNodes et aux accesseurs FormCalc

La résolution suit les occurrences répétées courantes immédiatement après insertion, suppression ou déplacement d'une instance ; les transactions runtime qui réussissent sauvegardent les écritures de champs sélectionnées vers leurs cibles de données natives et dans le XDP enregistré

Chemins et occurrences

CheminSélection
row[1].cellLa deuxième ligne et sa cellule sélectionnée
row[*].cellLa cellule sélectionnée dans chaque ligne
$form.main.row.cellLa première ligne et la première cellule via un chemin absolu
row[-1].cellLa ligne précédant l'occurrence inférée
row[+1].cellLa ligne suivant l'occurrence inférée
main..cell[*]Les cellules sœurs correspondantes dans la première branche descendante
main.*Tous les enfants directs dans l'ordre du document
main.#field[name='target']Les champs sélectionnés par un prédicat sur la propriété de nommage
main.#subform[*].#fieldLe champ sélectionné sous chaque subform, en faisant correspondre les noms de classes
main.part\.nameUn chemin de résolveur JavaScript contenant un point échappé dans un nom de nœud

Un index omis sélectionne une occurrence ; un chemin absolu utilise l'occurrence zéro, tandis qu'un chemin scopé emprunte l'index de l'ancêtre ou du conteneur correspondant quand les structures ont des sœurs répétées

L'inférence d'index suit les niveaux de hiérarchie correspondants même quand les nœuds source et destination portent des noms différents ; les sélecteurs de classe empruntent l'index d'occurrence de classe correspondant

Une cible à occurrence unique est sélectionnée sans exiger l'index d'occurrence de l'appelant ; une occurrence inférée manquante renvoie une liste vide ou null au lieu de sélectionner silencieusement un autre scope

Les index relatifs sont des décalages par rapport à l'occurrence inférée sans préfixe et sont invalides dans les chemins absolus ; les expressions d'index FormCalc peuvent calculer une occurrence au runtime

Les conteneurs sans nom sont transparents pour la recherche d'enfants nommés ; la qualification par le parent et les propriétés prises en charge comme rawValue, name, className, index, presence et access sont disponibles, et les exports lexicaux des script objects peuvent être résolus et affectés via des chemins FormCalc

Conditions

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

Les prédicats JavaScript utilisent .(expression) et s'exécutent avec le candidat comme this ; les prédicats FormCalc utilisent .[expression] et résolvent les champs relatifs par rapport à ce candidat

Un prédicat sélectionne les sœurs correspondantes même quand [*] est omis ; les prédicats JavaScript résolvent aussi les noms de champs nus dans le scope du candidat, et les chemins de prédicats dans le source FormCalc doivent être passés comme chaînes de résolveur entre guillemets

La recherche descendante parcourt dans l'ordre du document une branche qui satisfait les composants de chemin restants ; une branche sans suffixe correspondant ne masque pas une correspondance complète ultérieure

Un index d'occurrence est local à son groupe de sœurs correspondantes ; un index hors limites termine cette recherche descendante, donc main..cell[1] ne sélectionne pas une cellule dans une autre ligne quand la première ligne n'a qu'une seule cellule

Un joker précédent évalue la recherche descendante indépendamment pour chaque contexte sélectionné, et un joker directement après une racine absolue sélectionne les enfants de la racine

Les prédicats JavaScript reçoivent les objets xfa et event de l'événement courant ; la recherche relative au candidat, les exceptions de prédicats et les écritures natives partagent la transaction englobante

Un Eval imbriqué hérite du candidat du prédicat, utilise des variables et fonctions de calcul isolées, et partage les réponses de compilation natives et le replay transactionnel avec l'événement englobant

Exists(missing) et un accesseur vers une occurrence indexée inexistante renvoient 0 via Exists ; l'usage ordinaire d'un objet FormCalc non résolu lève une erreur

Budgets et migration

Les chemins admettent au plus 128 composants et 65 536 unités de code UTF-16 ; les index doivent être des entiers sûrs (safe integers), et le parcours, les prédicats, la compilation dynamique et les opérations d'instances partagent les budgets d'exécution des événements

Les erreurs du parser, les exceptions de prédicats et les budgets dépassés avortent l'événement et restaurent les valeurs de champs natives, l'ordre des instances et l'état des scripts via TXFAWidgetRuntime

L'ancien resolveNodes général développait les index omis à travers tous les ancêtres répétés ; utilisez main.row[*].cell[*] quand chaque ligne et chaque cellule sont visées, à la place de main.row.cell[*]

Couverture

Le résolveur opère sur les objets de formulaire dynamiques fournis par les event bindings, y compris les champs, subforms, draws, exclusion groups, areas et script objects, le Data DOM natif exposé via $data et $record, et les nœuds de propriétés de template déclarés avec leurs attributs effectifs

L'échappement de noms JavaScript est pris en charge par les chaînes de résolveur ; les identifiants du source FormCalc conservent la grammaire d'identifiants du compilateur

APIs associées

HPDFXFACompileFormCalcEvent, HPDFXFAExecuteJavaScriptEvent, Eval dynamique, Références FormCalc et Runtime XFA interactif