Fusionner des données XML depuis des sources multiples
Les données XML depuis de multiples fichiers source XML peuvent être fusionnées quand XSLT 2.0 ou 3.0 est utilisé comme version XSLT du fichier SPS.
Généralement, fusionner des données sera basé sur un morceau de données commun, tel qu’une ID. Par exemple, un employé d’une entreprise, qui est identifié par un numéro d’ID personnel, peut avoir ses données personnelles stockées dans de multiples fichiers XML gérés par le département du personnel : (i) détails personnels, (ii) liste de paie, (iii) travail et congé, (iv) cours suivis, etc. Les données de ces fichiers différents peuvent être fusionnés en un seul document de sortie utilisant le numéro ID personnel comme clé.
Note : L’édition Enterprise vous permet d’inclure des sources de schéma multiples, donc les nœuds XML depuis d’autres schémas peuvent être sélectionnés utilisant le nom de paramètre pour le schéma correspondant (comme c’est le cas dans l’exemple ci-dessous). Dans les éditions Professional et Basic, la fonction doc() de XPath 2.0 peut être utilisée pour trouver le fichier XML requis et le nœud XML à l’intérieur de ce fichier. La fonction doc() de XPath 2.0 fournit l’accès à la racine du document des documents XML externes, permettant donc d’insérer du contenu de nœud des documents XML externes à insérer dans la sortie. Un calcul automatique qui utilise la fonction doc() peut, pour cette raison, aussi être utilisé afin de fusionner les données XML (voir exemple ci-dessous).
Exemple
Le dossier (Mes) Documents, C:\Documents and Settings\<username>\My Documents\Altova\StyleVision2025\StyleVisionExamples, contient un fichier d’exemple SPS (MergeData_2_Files.sps) qui affiche comment les données de différents fichiers source XML peuvent être fusionnées. Le fichier SPS sélectionne les données selon un ordre (MergeOrder.xml, recensé ci-dessous) placé par un client fictif.
<?xml version="1.0" encoding="UTF-8"?>
<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MergeOrder.xsd">
<Item partNum="238-KK" quantity="3" shipDate="2000-01-07" comment="With no inclusions, please."/>
<Item partNum="748-OT" quantity="1" shipDate="2000-02-14" comment="Valentine's day packaging."/>
<Item partNum="229-OB" quantity="1" shipDate="1999-12-05"/>
<Item partNum="833-AA" quantity="2" shipDate="1999-12-05" comment="Need this for the holidays!"/>
</Order>
La valeur de l’attribut /Order/Item/@partNum dans ce fichier (voir ci-dessus) est utilisée pour sélectionner les produits commandés du catalogue d’articles stocké dans un autre fichier, MergeArticles.xml (voir la liste ci-dessous).
<?xml version="1.0" encoding="UTF-8"?>
<Articles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MergeArticles.xsd">
<Article PartNum="833-AA">
<ProductName>Lapis necklace</ProductName>
<Price>99.95</Price>
</Article>
<Article PartNum="748-OT">
<ProductName>Diamond heart</ProductName>
<Price>248.90</Price>
</Article>
<Article PartNum="783-KL">
<ProductName>Uncut diamond</ProductName>
<Price>79.90</Price>
</Article>
<Article PartNum="238-KK">
<ProductName>Amber ring</ProductName>
<Price>89.90</Price>
</Article>
<Article PartNum="229-OB">
<ProductName>Pearl necklace</ProductName>
<Price>4879.00</Price>
</Article>
<Article PartNum="128-UL">
<ProductName>Jade earring</ProductName>
<Price>179.90</Price>
</Article>
...
</Article>
La manière dont les données sont fusionnées est la suivante : un modèle défini par l’utilisateur au sein du modèle /Order/Item (voir la capture d’écran ci-dessous) qui sélectionne l’élément correspondant Article dans le fichier MergeArticles.xml en utilisant le numéro de partie de l’item commandé afin d’identifier l’article. L’expression XPath (qui est dans le contexte /Order/Item) est : $Articles//Article[@PartNum=current()/@partNum]

Ce modèle produira une sortie comme celle affichée dans la capture d’écran ci-dessous.

Notez que tandis que la quantité commandée de chaque item est prise du fichier MergeOrder.xml, le nom de l’article commandé est pris du fichier MergeArticles.xml. Notez également comment le nœud ProductName est sélectionné dans le contexte du modèle /Articles/Article.
Le même résultat tel que celui obtenu ci-dessus peut être atteint également en utilisant en utilisant le calcul automatique (voir la capture d’écran ci-dessous). Glissez l’attribut quantity de la fenêtre de l’arborescence de schéma et créez-le comme son contenu. Ajoutez ensuite un calcul automatique tel qu’affiché dans la capture d’écran et attribuez une expression XPath au calcul automatique tel que décrit ci-dessous.

L’expression XPath du calcul automatique pourrait cibler le nœud requis utilisant soit le paramètre d’une autre source de schéma ou de la fonction doc() :
$Articles//Article[@PartNum=current()/@partNum]/ProductName
ou
doc('MergeArticles.xml')//Article[@PartNum=current()/@partNum]/ProductName
Notez que, tandis que la première expression XPath utilise un paramètre pour faire référence à un autre schéma XML (une fonction disponible uniquement dans l’édition Enterprise), la deuxième expression utilise la fonction doc() de XPath 2.0 (une fonction disponible dans les éditions Professional et Basic également).