Le contexte de mappage
Les composants de mappage sont des structures hiérarchiques qui peuvent contenir plusieurs niveaux de profondeur. D’un autre côté, un mappage peut avoir plusieurs sources et composants, plus des composants intermédiaires comme des fonctions, des filtres, des value-maps, etc. Cela rajoute de la complexité dans l’algorithme de mappage, en particulier si plusieurs composants non-liés sont connectés. Afin de pouvoir exécuter le mappage en petites parties, une étape à la fois, un contexte actuel doit être établi poru chaque connexion.
On pourrait donc dire que plusieurs "contextes actuels" sont établis pour la durée de l’exécution de mappage, depuis les modifications de contexte actuels à chaque connexion traitée.
MapForce établit toujours le contexte actuel en commençant depuis l’item de racine cible (nœud). C’est là que l’exécution du mappage commence réellement. La connexion à l’item de racine cible est retracée à tous les items de source qui y sont connectés directement ou indirectement, y compris par le biais de fonctions ou d’autres composants intermédiaires. Tous les items de source et les résultats produits par les fonctions sont ajoutés au contexte actuel.
Une fois que le processus dans le nœud cible est terminé, MapForce se déplace vers le bas de la hiérarchie. Concrètement, il traite tous les items mappés du composant cible du haut en bas. Pour chaque item, un nouveau contexte est établi qui contient au début tous les items du contexte parent. Ainsi, tous les items frères mappés dans un composant cible sont indépendants l’un de l’autre, mais ont accès à toutes les données de source de leurs items parent.
Nous allons voir comment les éléments sus-mentionnés s'appliquent en pratique, sur la base d’un mappage d’exemple, PersonListByBranchOffice.mfd. Vous trouverez ce mappage dans le répertoire <Documents>\Altova\MapForce2024\MapForceExamples\.
![mf_udf_19](./images/mf_udf_19.png)
Dans le mappage ci-dessus, les composants de source et cible sont XML. Le fichier de source XML contient deux éléments Office.
Comme mentionné précédemment, l’exécution de mappage commence toujours depuis le nœud de racine cible (PersonList, dans cet exemple). En retraçant la connexion (par le biais du filtre et de la fonction) vers un item de source, vous pouvez conclure que l’item de source est Office. (L’autre chemin de connexion mène à un paramètres d'entrée et son objectif est expliqué ci-dessous).
S’il y avait une connexion directe entre Office et PersonList, alors, conformément à la règle de mappage générale, le mappage aurait créé autant d’items d’instance PersonList qu’il y a d’items Office dans le fichier source. Néanmoins, cela ne se produira pas ici, étant donné qu’il y a un filtre entre les deux. Le filtre n’apporte au composant de cible que les données qui satisfont à la condition Booléenne connectée à l’entrée bool du filtre. La fonction equal retourne true si le nom de bureau est égal à "Nanonull, Inc.". Cette condition n’est satisfaite qu’une seule fois, car il n’y a qu’un seul nom de bureau dans le fichier XML de source.
Par conséquent, la connexion entre Office et PersonList définit un seul bureau en tant que le contexte pour l’ensemble du document cible. Cela signifie que tous les descendants de l’item PersonList ont accès aux données du bureau "Nanonull, Inc.", et qu’aucun autre bureau n’existe dans le contexte actuel.
La connexion suivante est entre Contact et Person. Conformément à la règle générale de mappage, elle créera une cible Person pour chaque source Contact. À chaque itération, cette connexion établit un nouveau contexte actuel ; c’est pourquoi les connexions enfant (first à First, last à Last) fournissent des données depuis l’item de source vers la cible dans le contexte de chaque Person.
Si vous avez ignoré la connexion entre Contact et Person, alors le mappage créera uniquement une Person avec plusieurs nœuds First, Last, et Details. Dans ces cas, MapForce émet un avertissement et une suggestion dans la fenêtre Messages, par exemple :
![mf_semantics_01](./images/mf_semantics_01.png)
Enfin, le mappage comprend une fonction définie par l'utilisateur, LookupPerson. La fonction définie par l'utilisateur est aussi exécutée dans le contexte de chaque Person, étant donné que la connexion parent entre Contact et Person. Spécifiquement, à chaque fois qu’un nouvel item Person est créé du côté cible, la fonction est appelée pour remplir l’élément Details de la personne. Cette fonction prend trois paramètres d'entrée. Le premier (OfficeName) est défini pour lire des données provenant du paramètres d'entrée du mappage. Les données source pour ce paramètre peuvent aussi bien être fournies par l’item de source Name, sans aucunement changer la sortie de mappage. Dans tous les cas, la valeur de source est la même et est prise depuis un contexte de parent. En interne, la fonction de consultation concatène les valeurs reçues en tant qu’arguments et produit une seule valeur. Pour plus d’informations concernant le fonctionnement de la fonction LookupPerson, voir l’Exemple: Consultation et Concaténation.