Combinar datos XML de distintas fuentes
Si usa la versión XSLT 2.0 o XSLT 3.0 con el diseño SPS podrá combinar los datos XML de varios archivos XML de origen.
Lo normal es basar la combinación de datos en un componente de datos común, como un número de identificación. Por ejemplo, un empleado de una compañía, al que se identifica con un número de Id. personal, puede tener sus datos personales repartidos por varios archivos XML del departamento de recursos humanos: (i) sus datos personales, (ii) datos sobre su nómina, (iii) datos sobre horas de trabajo y vacaciones, (iv) formación y cursos, etc. Los datos de todos estos archivos se pueden unir en un solo documento de salida usando el número de Id. como clave.
Nota: | en la edición Enterprise Edition se pueden incluir varios esquemas fuente en el diseño SPS. De ese modo, puede seleccionar nodos de otros esquemas usando el nombre de parámetro del esquema pertinente (como en el ejemplo que aparece más abajo). En las ediciones Professional y Basic Edition puede usar la función XPath 2.0 doc() para buscar el archivo XML correspondiente y el nodo XML deseado. La función XPath 2.0 doc() ofrece acceso a la raíz de documento de documentos XML externos, lo cual permite insertar en documentos de salida el contenido de nodos de documentos XML externos. Por tanto, puede usar cálculos automáticos que utilicen la función doc() para combinar datos XML (ver ejemplo siguiente). |
Ejemplo
La carpeta (Mis) Documentos, C:\Documents and Settings\<usuario>\Mis Documentos\Altova\StyleVision2023\StyleVisionExamples, contiene el archivo de ejemplo MergeData_2_Files.sps. Este archivo ilustra cómo combinar datos de varios archivos XML diferentes. El diseño SPS selecciona datos de un pedido (MergeOrder.xml) realizado por un cliente ficticio:
<?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>
El valor del atributo /Order/Item/@partNum de este archivo (fragmento anterior) se usa para seleccionar los productos del pedido en el catálogo de artículos, que está en este otro archivo (MergeArticles.xml):
<?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>
...
</Articles>
Para combinar los datos, primero se creó una plantilla definida por el usuario dentro de la plantilla /Order/Item (imagen siguiente) que selecciona el correspondiente elemento Article en el archivo MergeArticles.xml con ayuda del número del atributo partNum. La expresión XPath (que está en el contexto /Order/Item) sería esta: \$Articles//Article[@PartNum=current()/@partNum]
Esta plantilla genera un resultado parecido a este:
Observe que la cantidad solicitada de cada artículo se toma del archivo MergeOrder.xml, mientras que el nombre del artículo solicitado se toma del archivo MergeArticles.xml. Además, el nodo ProductName se selecciona dentro del contexto de la plantilla /Articles/Article.
Podemos obtener el mismo resultado con un cálculo automático (imagen siguiente). Arrastre el atributo quantity desde la ventana Estructura del esquema y cree contenido a partir del atributo. Después añada un cálculo automático como el de la imagen siguiente y asígnele una expresión XPath (ver más abajo).
La expresión XPath del cálculo automático puede apuntar al nodo necesario usando el parámetro de otro esquema fuente o usando la función doc():
\$Articles//Article[@PartNum=current()/@partNum]/ProductName
o
doc('MergeArticles.xml')//Article[@PartNum=current()/@partNum]/ProductName
Observe que, mientras la primera expresión XPath utiliza un parámetro para hacer referencia a otro esquema XML (función disponible solamente en la edición Enterprise Edition), la segunda expresión utiliza la función XPath 2.0 doc() (función disponible también en las ediciones Professional y Basic).