2013-03-13 67 views
0
I have a pair of XML Files with following structure : 

* the data contained here is random 

     <root_tag> 
     <packages> 
     <package> 
      <name>class_name1</name> 
      <classes>3</classes> 
      <functions>21</functions> 
      < ncss>285</ncss> 
      <javadocs>20</javadocs> 
      <javadoc_lines>111</javadoc_lines> 
      <single_comment_lines>11</single_comment_lines> 
      <multi_comment_lines>222</multi_comment_lines> 
    </package> 
    </packages> 

    <objects> 

     <object> 
      <name>object1</name> 
      <ncss>255</ncss> 
      <functions>17</functions> 
      <classes>2</classes> 
      <javadocs>20</javadocs> 
     </object> 

    </objects< 
    <functions> 
    <function> 
      <name>function1</name> 
      <ncss>242</ncss> 
      <ccn>63</ccn> 
      <javadocs>1</javadocs> 
     </function> 
    </functions> 
    </root_tag> 

的包裝具有以下在其內的數據項分配ID:合併與相同元件2個的XML文件,並唯一項目

名稱的類的功能NCSS的javadocs javadoc_lines single_comment_lines multi_comment_lines

一個目的有以下數據項與它相關聯:

名稱功能NCSS的javadoc類

,函數有以下數據項:

名國家福利理事會CCN的javadoc

假設我的第二個XML文件包含功能1一些不同的值。如何這些XML文件合併成第三個文件,並分配一個唯一的ID給每個name元素,以便輸出如下:

File Id Name Classes Functions NCSS JavaDocs JavaDocLines SingleCommentLines 

File1 func1 somefun Null  Null  10 20  30   40 

File2 func1 somefun Null  Null  11 23  40   50 

,是有沒有辦法通過一個Java程序做到這一點?

+0

使用JAXB,將其打成java數據結構,並執行您的任務。或者使用SAX或StAX手動執行此操作。 – 2013-03-13 09:50:02

+0

@ bmorris591我一直希望使用XSLT轉換,因爲將xml編組爲對象,然後處理它們並將它們寫回xml形式似乎非常耗時,並且出於某種原因,我無法讓JAXB jar工作我的日食副本。 – 2013-03-13 10:47:47

回答

1

使用XSLT,你可以像這樣的東西實現它:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="2.0"> 
<!-- You need to store the other inputs in xsl:variable to access it inside the same 
stylesheet --> 
<xsl:variable name="file2" select="document('file2.xml')"/> 
<xsl:output method="xml"/> 
<xsl:template match="root_tag"> 
    <!--Open here your personnal layout stuffs, 
    like opening tables <table:table> and things like that (column labels...)--> 
    <table> 
    <labels/> 
    <xsl:apply-templates select=".//function | $file2//function"> 
     <!-- All the work is done by the xsl:sort which can specify the order you 
     want to process you elements. --> 
     <xsl:sort select="name"/> 
    </xsl:apply-templates> 
    <!-- Close here your layout stuffs --> 
    </table> 
</xsl:template> 

<xsl:template match="function"> 
    <!-- Open here your layout inline stuffs--> 
    <line> 
    <!-- Here you may prefer to apply the templates 
     in specific order in case of 'melted' input, 
     do this by calling templates in queue, like <xsl:apply-templates 
     select="name"/> <xsl:apply-templates select="ncss"/>...--> 
     <xsl:apply-templates select="*"/> 
    <!-- Close here your layout inline stuffs -->    
    </line> 
</xsl:template> 

<!-- This template may apply to anything but he's applied only on function childs 
during the process --> 
<xsl:template match="*"> 
    <!-- Open here the cell stuffs (<table:table-cell>) --> 
    <cell> 
    <xsl:value-of select="."/> 
    <!-- Close here the cell stuffs--> 
    </cell> 
</xsl:template> 

我用一些虛擬元素的「佈局東西」(如表,線和電池)。

希望這可能有所幫助。