2017-02-17 59 views
-1

我一直在嘗試不同的解決方案來實現這一點。我有以下XML結構根據標籤拆分4GB xml

<fullListing> 
    <employeeList> 
     <employee> 
      <name>emp1</name> 
      <id>1</id> 
     </employee> 
     <employee> 
      <name>emp2</name> 
      <id>2</id> 
     </employee> 
     <employee> 
      <name>emp3</name> 
      <id>3</id> 
     </employee> 
    </employeeList> 
    <departmentList> 
     <department> 
      <name>dept1</name> 
      <id>1</id> 
     </department> 
     <department> 
      <name>dept2</name> 
      <id>2</id> 
     </department> 
     <department> 
      <name>dept3</name> 
      <id>3</id> 
     </department> 
    </departmentList> 
    <regionData> 
     <region> 
      <zip>123321</zip> 
      <abc>aa</abc> 
     </region> 
     <region> 
      <zip>223311</zip> 
      <abc>bb</abc> 
     </region> 
     <region> 
      <zip>112233</zip> 
      <abc>cc</abc> 
     </region> 
     <zipmapping> 
      <zip>111111</zip> 
      <regionId>1</regionId> 
     </zipmapping> 
     <zipmapping> 
      <zip>222222</zip> 
      <regionId>2</regionId> 
     </zipmapping> 
     <zipmapping> 
      <zip>333333</zip> 
      <regionId>3</regionId> 
     </zipmapping> 
     <zipmapping> 
      <zip>444444</zip> 
      <regionId>4</regionId> 
     </zipmapping> 
     <areaMapping> 
      <zip>121212</zip> 
      <regionId>12</regionId> 
     </areaMapping> 
       <areaMapping> 
      <zip>131313</zip> 
      <regionId>13</regionId> 
     </areaMapping> 
       <areaMapping> 
      <zip>141414</zip> 
      <regionId>14</regionId> 
     </areaMapping> 
    </regionData> 
</fullListing> 

現在我需要一個有效的解決方案上面的XML拆分爲多個小文件

所以我需要在最後的是:

<employeeList> --> emplist file 
<departmentList> --> deptlist file 

等上。

任何建議/想法?

+0

自從我這樣做了很長一段時間以來,它就像繼承',並在[將XML文件(InputStream)傳遞給XSLT的答案中使用TransformerFactory以避免在XSLT javax.xml中使用Document](http://stackoverflow.com/a/26172836/6768037)? –

+0

因此,對於任何類型的根元素的子元素,你想創建一個單獨的文件? –

回答

1

假設一個XSLT 3.0處理器像撒克遜9.6或9.7 EE支持streaming你可以寫的根元素的任何兒童使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:mode streamable="yes"/> 

    <xsl:template match="/*/*"> 
     <xsl:result-document href="{local-name()}.xml"> 
      <xsl:copy-of select="."/> 
     </xsl:result-document> 
    </xsl:template> 

</xsl:stylesheet> 

使用<xsl:result-document href="{local-name()}.xml">這接近一個單獨的文件,如果沒有才起作用同名的子元素。

+0

如果有多個具有相同名稱的元素,您可以使用'href =「{local-name()} {position()}。xml」' –

+1

@MichaelKay,是的,這將是一種獲取唯一URI的方法結果文件但是編號可能有點奇怪('foo1.xml','bar2.xml','foo3.xml'),所以我寧願設置一個累加器來保存一個按照元素名稱計數的映射,這樣我們會得到'foo1.xml','bar2.xml','foo2.xml'等。 –