2010-10-27 88 views
29

我很難將XSLT打包成XSLT,但我聽說可以將XML文件拆分爲多個文件。基本上我想複製所有的元素到第一個文件和最後一個文件之後,然後爲每個輸出文件添加單個文件內容。使用XSLT將XML拆分爲多個文件

如果有可能的話,有人能給我一些指示嗎?

感謝,

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> 

OUTPUT:

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

好問題,+1。查看我的答案,瞭解有關XSLT(1.0和2.0)產生多重輸出結果的標準支持方向。 – 2010-10-27 18:43:13

+0

我有一個要求將大的XML文件分割成更小的文件,但我要寫一個程序來做(它需要輪詢一個文件夾和處理大於x megs的文件)​​ - 有很多不同的文件類型 - 例如,我不知道前面的XML結構,所以我需要一個通用的分離器 - 可以用XSLT來完成,還是應該使用.NET XML閱讀工具? – Rodney 2011-07-26 07:43:59

+0

@ Rodney--你應該看看VTD-XML,它非常適合處理/分割大型XML – 2016-05-03 20:39:53

回答

14

在回答關於@ Dimitre的回答您的評論...

你寫,

<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> 

這不完全匹配你的XML,它具有rootelem作爲最外層的元素,和您的評論說root作爲最外面的元素。你可能想是這樣的:

<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> 

你可以更大膽,嘗試使用<xsl:copy>而不是根和元素文字結果元素,但它似乎不值得的,除非他們打算改變。

+0

你是對的拉爾斯,對不起草率複製的實際文件。我做了類似於你所擁有的東西,但問題是root和elem有我需要維護的各種屬性。但也許我可以以某種方式使用父母仍然試圖圍繞xslt包裹我的頭。 – 2010-10-27 21:54:25

+0

@Nisse,我編輯了答案以保留root和elem的屬性。 xsl:copy-of的問題在於你不能修改被複制的部分......你只需複製你選擇的節點下的整個樹。你不能添加或省略任何東西。所以你不能xsl:copy-of/root或/ root/elem。但是,如果你xsl:複製所需的屬性,你的狀態良好。 – LarsH 2010-10-28 01:36:54

12

這是不可能在純XSLT 1.0以產生多於一個輸出文件。爲此,人們可以使用擴展元素。

在XSLT 2.0中,使用<xsl:result-document>元素。

+0

嗨Dimitre,謝謝你的回覆。我現在正在使用xsl:result-document,它將文件拆分,但將作爲頂級元素。但是,我想在每個生成的文件中保留。對此有何建議? < xsl:copy-of select =「。」/> 2010-10-27 20:19:14

+0

我可以知道如何在VS2010專業版中配置 。 – 2012-06-12 11:00:15

+0

@Jeevan:實現這一目標的唯一途徑就是安裝EXSLT-MVP--請參閱Oleg Tkachenko的公告:http://www.tkachenko.com/blog/archives/000293.html – 2012-06-12 12:00:15

2

如果你想使用

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

從ANT XSLT通話時,您需要使用2.0,只需添加以下您的ANT電話:

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

而且specifiy版本=」 2.0「 並享受文件分割。

+0

@millebbi:對不起,但也許這應該在另一個問題,實際上詢問有關ant與Saxon XSLT處理器集成... – 2011-01-18 00:34:54

+0

那麼它會在兩個,因爲我也想用:,但ANT默認使用1.0,添加此ANT語句可以使用 millebii 2011-01-18 11:28:51