Trituración XML a través de XSLT en Java

Necesito transformar archivos XML grandes que tienen una estructura anidada (jerárquica) del formulario

 Flat XML Hierarchical XML (multiple blocks, some repetitive) Flat XML  

en una forma más plana (“triturada”), con 1 bloque para cada bloque nested repetitivo.

Los datos tienen numerosas tags diferentes y variaciones de jerarquía (especialmente en el número de tags del XML triturado antes y después del XML jerárquico), por lo que idealmente no debería hacerse ninguna suposición sobre nombres de tags y atributos, o el nivel jerárquico.

Una vista de alto nivel de la jerarquía para solo 4 niveles sería algo así como

  ...  ...  ... A B ...  ...  ...  

y el resultado deseado sería entonces

  ...  ...  ... A ...  ...  ...   ...  ...  ... B ...  ...  ...  

Es decir, si en cada nivel i hay diferentes componentes Product(Li) , se producirá un total de Componentes diferentes del Product(Li) (solo 2 arriba, ya que el único factor diferenciador es el Nivel 4, entonces L1*L2*L3*L4 = 2 )

Por lo que he visto, XSLT puede ser el camino a seguir, pero cualquier otra solución (por ejemplo, StAX o incluso JDOM) sería suficiente.

Un ejemplo más detallado, usando información ficticia, sería

  
123 A Street
28 List of previous jobs in the US 3 01/10/2001 38 01/12/2004 6 01/06/2005 10 List of previous jobs in the UK 2 01/05/1999 25 01/07/2001 3 true 6

Los datos anteriores se deben triturar en 5 bloques (es decir, uno para cada bloque diferente), cada uno de los cuales dejará idénticas todas las demás tags y solo tendrá un único elemento . Entonces, dados los 5 bloques diferentes en el ejemplo anterior, el XML transformado (“triturado”) sería

  
123 A Street
28 List of previous jobs in the US 3 01/10/2001 38 true 6
123 A Street
28 List of previous jobs in the US 3 01/12/2004 6 true 6
123 A Street
28 List of previous jobs in the US 3 01/06/2005 10 true 6
123 A Street
28 List of previous jobs in the UK 3 01/05/1999 25 true 6
123 A Street
28 List of previous jobs in the UK 3 01/07/2001 3 true 6

Dado el siguiente XML:

 < ?xml version="1.0" encoding="utf-8" ?>  
123 A Street
28 List of previous jobs in the US 3 01/10/2001 38 01/12/2004 6 01/06/2005 10 List of previous jobs in the UK 2 01/05/1999 25 01/07/2001 3 true 6

El siguiente XSLT:

 < ?xml version="1.0" encoding="utf-8"?>             

Da el siguiente resultado:

 < ?xml version="1.0" encoding="utf-8"?>   
123 A Street
28 List of previous jobs in the US 3 01/10/2001 38 true 6
123 A Street
28 List of previous jobs in the US 3 01/12/2004 6 true 6
123 A Street
28 List of previous jobs in the US 3 01/06/2005 10 true 6
123 A Street
28 List of previous jobs in the UK 2 01/05/1999 25 true 6
123 A Street
28 List of previous jobs in the UK 2 01/07/2001 3 true 6

Tenga en cuenta que he agregado un elemento raíz de salida para garantizar que el documento esté bien formado.

¿Es esto lo que querías?

También podría usar xsl: copy para copiar los elementos de nivel superior, pero necesito pensar en esto un poco más. Con el xslt anterior, tienes más control, pero también tienes que redefinir tus elementos …

Aquí hay una solución genérica según lo solicitado :

                                           

Cuando se aplica en el documento XML simplificado (y genérico) proporcionado :

  ...  ...  ... A B ...  ...  ...  

el resultado deseado y correcto se produce :

  ...  ...  A  ...  ...   ...  ...  B  ...  ...  

Ahora, si cambiamos la línea :

   

a:

   

y aplicar la transformación al documento XML del Employee :

  
123 A Street
28 List of previous jobs in the US 3 01/10/2001 38 01/12/2004 6 01/06/2005 10 List of previous jobs in the UK 2 01/05/1999 25 01/07/2001 3 true 6

nuevamente obtenemos el resultado deseado y correcto :

   
123 A Street
28 List of previous jobs in the US 3 01/10/2001 38 true 6
123 A Street
28 List of previous jobs in the US 3 01/12/2004 6 true 6
123 A Street
28 List of previous jobs in the US 3 01/06/2005 10 true 6
123 A Street
28 List of previous jobs in the UK 2 01/05/1999 25 true 6
123 A Street
28 List of previous jobs in the UK 2 01/07/2001 3 true 6

Explicación : El procesamiento se realiza en una plantilla con nombre ( StructRepro ) y se controla mediante un solo parámetro externo denominado pLeafNodes , que debe contener un conjunto de nodos de todos los nodos cuya “estructura ascendente” se va a reproducir en el resultado.