2010-10-27 26 views
29

Me está costando pasar revista a XSLT, pero escuché que es posible dividir un archivo XML en varios archivos. Básicamente me gustaría copiar todos los elementos hasta el primer archivo y después del último archivo y luego agregar el contenido del archivo individual para cada archivo de salida.División de XML en varios archivos con XSLT

¿Podría alguien darme algunos consejos sobre esto si es posible?

Gracias,

complete.xml

<rootelem> 
    <elem> 
    <file attr1='1'> 
     <content>content file 1</content> 
    </file> 
    <file attr2='2'> 
     <content>content file 2</content> 
    </file> 
    <file attr3='3'> 
     <content>content file 3</content> 
    </file> 
    </elem> 
</rootelem> 

SALIDA:

complete_PART1.xml

<rootelem> 
    <elem> 
    <file attr1='1'> 
     <content>content file 1</content> 
    </file> 
    </elem> 
</rootelem> 

complete_PART2.xml

<rootelem> 
    <elem> 
    <file attr2='2'> 
     <content>content file 2</content> 
    </file> 
    </elem> 
</rootelem> 

complete_PART3.xml

<rootelem> 
    <elem> 
    <file attr3='3'> 
     <content>content file 3</content> 
    </file> 
    </elem> 
</rootelem> 
+0

Buena pregunta, +1. Consulte mi respuesta para obtener instrucciones sobre el soporte estándar de XSLT (1.0 y 2.0) para producir resultados de salida multiplr. –

+0

Tengo un requerimiento para dividir archivos XML grandes en archivos más pequeños, pero iba a escribir un programa para hacer (necesita sondear una carpeta y procesar archivos a través de x megs big) - hay muchos tipos de archivos diferentes - p. No conozco la estructura XML por adelantado, así que necesito un divisor genérico. ¿Se puede hacer esto con XSLT o debería usar las herramientas de lectura XML de .NET? – Rodney

+0

@ Rodney-- debe ver en VTD-XML, que es ideal para procesar/dividir grandes XML –

Respuesta

14

respuesta a sus comentarios sobre la respuesta de @ Dimitre ...

Usted escribió,

<xsl:template match="/"> 
    <xsl:for-each select="elem/file"> 
    <xsl:result-document method="xml" href="file_{@id}-output.xml"> 
     <xsl:copy-of select="."/> 
    </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

Esto no se ajusta exactamente con el código XML, que tiene rootelem como un elemento más externo, y su comentario dice root como un elemento más externo. Es posible que desee algo como esto:

<xsl:template match="/root"> 
    <xsl:for-each select="elem/file"> 
    <xsl:result-document method="xml" href="file_{@id}-output.xml"> 
     <root> 
     <xsl:copy-of select="/root/@*" /> 
     <elem> 
      <xsl:copy-of select="../@* | ." /> 
     </elem> 
     </root> 
    </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

Usted podría conseguir más elegante, tratando de utilizar <xsl:copy> en lugar de los elementos de resultado literales de raíz y elem, pero no parece vale la pena el esfuerzo a menos que van a variar.

+0

Tienes razón Lars, lo siento copia descuidada del archivo real. Hice algo similar a lo que tienes pero el problema es que raíz y elem tienen varios atributos que debo mantener. Pero tal vez de alguna manera puedo usar el padre todavía estoy intentando abarcar a xslt. –

+0

@Nisse, edité la respuesta para conservar los atributos de raíz y elem. El problema con xsl: copy-of es que no puede modificar las partes de lo que se copia ... solo copia los árboles enteros debajo de los nodos que seleccione. No puede agregar u omitir nada. Por lo tanto, no puede xsl: copy-of/root o/root/elem. Pero si usa xsl: copia de los atributos necesarios, está en buena forma. – LarsH

12

No es posible en XSLT 1.0 pura para producir más de un archivo de salida. Se podría usar el elemento de extensión <exslt:document> para este propósito.

En XSLT 2.0 utilice el elemento <xsl:result-document>.

+0

Hola Dimitre, gracias por su respuesta. Estoy usando xsl: result-document ahora y divide el archivo pero pone como el elemento de nivel superior. Sin embargo, quiero mantener y en cada uno de los archivos generados. Alguna sugerencia sobre eso? < xsl: copy-of select = "." />

+0

, puedo saber cómo configurar la extensión en VS2010 professional . –

+0

@Jeevan: Una (la única que sé) forma de lograr esto es instalar EXSLT-MVP - ver este anuncio de Oleg Tkachenko: http://www.tkachenko.com/blog/archives/000293.html –

2

Si desea utilizar

<xsl:result-document method="xml" href="file_{@id}-output.xml"> 

de una llamada XSLT ANT, es necesario utilizar 2.0, sólo tiene que añadir lo siguiente en su llamada ANT:.

<classpath location="/home/ap/saxon/saxon8.jar" /> 

Y specifiy versión =" 2.0 " Y disfrute de la división de archivos.

+0

@millebbi: Lo siento, pero tal vez esto debería ir en otra pregunta que realmente pregunta sobre la integración de hormiga con el procesador XSLT de Saxon ... –

+0

Bueno, iría en ambos, porque también quería usar: ; sin embargo, ANT usa de forma predeterminada 1.0, con la adición de esta instrucción ANT puede usar millebii

Cuestiones relacionadas