La version 9.9 apporte bon nombre de changements, pour commencer au niveau de l’API s9api, une évolution des API Java pour accéder à des documents XML (comme JAXP), prévue pour les usages modernes de XML. Celle-ci a été conçue à partir des API .Net et uniformise XPath, XSLT et XQuery. L’un des grands apports de s9api, lors de sa sortie (à l’époque de Java 5), était d’utiliser les nouveautés du langage, comme les génériques et itérateurs. À nouveau, s9api s’aventure dans les nouveautés du langage Java, principalement les flux, afin de réduire l’utilisation de XPath dans le code Java. Cela permet de n’utiliser qu’un seul langage, donc d’éviter toute compilation d’expression (et l’inconvénient en performance associé), d’afficher plus rapidement des erreurs (qui pourront en bonne partie être détectées par le compilateur Java, sans extension) et d’empêcher une série d’attaques par injection. Par exemple, ces deux lignes sont équivalentes, sauf que la première utilise XPath (et doit construire une chaîne de caractères à la volée) et la seconde la nouvelle API :
Code java : | Sélectionner tout |
1 2 3 | xpath.evaluate("//book[author='" + key + "']", doc); doc.select(descendant("book").where(eq(child("author"), key)).asXdmValue(); |
Un nouveau type fait son apparition en XPath : les tuples. Celui-ci n’est pas normalisé (même si Saxon a une longue tradition d’offrir des fonctionnalités bien avant leur normalisation). L’intérêt est d’être plus précis sur les types des différents éléments des objets plus complexes : pour une base de données d’employés, au lieu de définir une table de hachage indexée par le nom sans pouvoir préciser le type des données stockées, map(xs:string, item()*), Saxon autorise la syntaxe tuple(empNr: xs:string, dob: xs:date, name: element(personalName)).
De nouvelles fonctions et instructions facilitent le travail avec des documents JSON. Par exemple, saxon:deep-update crée une nouvelle table de hachage ou un nouveau tableau obtenu en modifiant en profondeur une structure de données existante : pas au niveau du nœud racine, mais plus en profondeur dans l’arbre. Par exemple, pour ajouter une commande à un utilisateur spécifique :
Code xml : | Sélectionner tout |
1 2 | <saxon:deep-update root="json-doc('empData.json')" select="?*[?customer='Jones']?orders" action="array:append($order)"/> |
Les primitives de XQuery Update sont maintenant disponibles en XSLT. Elles permettent d’effectuer certaines opérations déclaratives, comme la suppression de tous les commentaires, bien plus simplement qu’avec les fonctionnalités standard de XSLT — sans perdre le côté déclaratif du langage. Une prochaine version devrait apporter des structures de données plus appropriées dans Saxon pour rendre ces opérations bien plus efficaces, sans devoir recopier les données qui n’ont pas changé.
Au niveau de la performance, les tableaux ont changé d’implémentation de telle sorte que les changements à un endroit d’un tableau ne provoquent pas une copie complète du tableau — une optimisation courante dans les langages fonctionnels. La représentation TinyTree des documents XML, spécifiquement optimisée pour occuper peu de mémoire, a été améliorée pour encore un peu réduire l’utilisation de mémoire et permettre les copies sans surcoût de sous-arbres lors d’une transformation.
Toutes ces nouveautés ne sont pas disponibles dans toutes les éditions de Saxon.
Source : Release of Saxon 9.9.
Voir aussi : tous les changements apportés par Saxon 9.9, télécharger Saxon 9.9.
Et vous ?
Que pensez-vous de cette nouvelle version de Saxon ?
Quelles nouveautés aimeriez-vous voir dans les prochaines versions ?