2011-01-28 54 views
9

me gustaría saber cómo escribir XSLT para dividir un archivo XML en varios archivos XML de acuerdo con los siguientes requisitos:Cómo dividir el archivo XML en muchos archivos XML mediante XSLT

  • file1.xml - Los lagos que se type = Natyral
  • file2.xml - Los lagos que escriben = artificial
  • file3.xml - Los lagos que escriben = glacial

archivo de llave de entrada XML es:

<Lakes> 
    <Lake> 
    <id>1</id> 
    <Name>Caspian</Name> 
    <Type>Natyral</Type> 
    </Lake> 
    <Lake> 
    <id>2</id> 
    <Name>Moreo</Name> 
    <Type>Glacial</Type> 
    </Lake> 
    <Lake> 
    <id>3</id> 
    <Name>Sina</Name> 
    <Type>Artificial</Type> 
    </Lake> 
</Lakes> 
+0

si la eficiencia es importante, vtd-xml es otra opción, también es fácil de usar, pero requiere un poco de codificación. –

Respuesta

3

Con XSL estándar no es posible tener más de una salida xml (es decir, árbol resultante).
Sin embargo, usando la extensión Xalan redirect, puede.

Eche un vistazo al ejemplo en la página en el enlace. He probado con el siguiente Xalan Java 2.7.1

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="/Lakes/Lake[Type='Natyral']"> 
     <redirect:write file="/home/me/file1.xml"> 
      <NatyralLakes> 
       <xsl:copy-of select="." /> 
      </NatyralLakes> 
     </redirect:write> 
    </xsl:template> 

    <xsl:template match="/Lakes/Lake[Type='Artificial']"> 
     <redirect:write file="/home/me/file1.xml"> 
      <ArtificialLakes> 
       <xsl:copy-of select="." /> 
      </ArtificialLakes> 
     </redirect:write> 
    </xsl:template> 

    <xsl:template match="/Lakes/Lake[Type='Glacial']"> 
     <redirect:write file="/home/me/file3.xml"> 
      <GlacialLakes> 
       <xsl:copy-of select="." /> 
      </GlacialLakes> 
     </redirect:write> 
    </xsl:template> 


</xsl:stylesheet> 
+0

Con XSLT 1.0 no es posible ... es muy posible en 2.0 –

+0

Sí, debería haber mencionado que estaba hablando de XSLT 1.0. Como Xalan implementa/no implementará xslt 2.0, me quedé con 1.0 en mi código java. También podría haber mencionado la extensión exslt 'document' que logra un resultado similar para xslt 1.0 –

+4

Por favor, no se refiera a XSLT 1.0 como" XSL estándar ". Mucha gente todavía lo usa, pero ya no es el estándar. –

18

uso de XSLT 2.0, al igual que esta hoja de estilo:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:for-each-group select="Lakes/Lake" group-by="Type"> 
      <xsl:result-document href="file{position()}.xml"> 
       <Lakes> 
        <xsl:copy-of select="current-group()"/> 
       </Lakes> 
      </xsl:result-document> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

Nota: xsl:result-document de instrucciones.