Hice buenas experiencias con STX (Streaming transformaciones para XML).Básicamente, es una versión transmitida de XSLT, muy adecuada para analizar grandes cantidades de datos con una huella de memoria mínima. Tiene una implementación en Java llamada Joost.
Debería ser fácil encontrar una transformación STX que ignore todos los elementos hasta que el elemento coincida con un XPath determinado, copie ese elemento y todos sus elementos secundarios (utilizando una plantilla de identidad dentro de un grupo de plantillas) y continúe ignorando elementos hasta el próximo partido.
ACTUALIZACIÓN
I hackeado una STX transformar que hace lo que entiendo que desea. En su mayoría, depende de características solo STX como grupos de plantillas y plantillas predeterminadas configurables.
<stx:transform xmlns:stx="http://stx.sourceforge.net/2002/ns"
version="1.0" pass-through="none" output-method="xml">
<stx:template match="element/child">
<stx:process-self group="copy" />
</stx:template>
<stx:group name="copy" pass-through="all">
</stx:group>
</stx:transform>
El pass-through="none"
en el stx:transform
configura las plantillas predeterminadas (por nodos, atributos etc.) para producir ninguna salida, pero los elementos proceso hijo. Entonces el stx:template
coincide con el XPath element/child
(este es el lugar donde pone su expresión de coincidencia), se "procesa a sí mismo" en el grupo "copiar", lo que significa que la plantilla correspondiente del group name="copy"
se invoca en el elemento actual. Ese grupo tiene pass-though="all"
, por lo que las plantillas predeterminadas copian su entrada y procesan elementos secundarios. Cuando finaliza el elemento element/child
, el control se devuelve a la plantilla que invoca process-self
, y los siguientes elementos se ignoran nuevamente. Hasta que la plantilla coincida nuevamente.
El siguiente es un ejemplo de archivo de entrada:
<root>
<child attribute="no-parent, so no copy">
</child>
<element id="id1">
<child attribute="value1">
text1<b>bold</b>
</child>
</element>
<element id="id2">
<child attribute="value2">
text2
<x:childX xmlns:x="http://x.example.com/x">
<!-- comment -->
yet more<b i="i" x:i="x-i" ></b>
</x:childX>
</child>
</element>
</root>
Este es el archivo de salida correspondiente:
<?xml version="1.0" encoding="UTF-8"?>
<child attribute="value1">
text1<b>bold</b>
</child><child attribute="value2">
text2
<x:childX xmlns:x="http://x.example.com/x">
<!-- comment -->
yet more<b i="i" x:i="x-i" />
</x:childX>
</child>
El formato inusual es el resultado de saltarse los nodos de texto que contienen saltos de línea fuera de los child
elementos .
Creo que VTD-XML extendido es ideal para eso, es compatible con la carga parcial de documentos (a través del mapa mem) y XPath ... cortar y pegar es muy superior a DOM o SAX –