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>

パッケージには、次のデータ項目が含まれています。

名前 クラス 関数 ncss javadocs javadoc_lines single_comment_lines multi_comment_lines

オブジェクトには、次のデータ項目が関連付けられています:

名前 関数 ncss javadocs クラス

関数には次のデータ項目があります。

name ncss ccn javadocs

2 番目の xml ファイルに function1 のいくつかの異なる値が含まれているとします。これらの xml ファイルを 3 番目のファイルにマージし、各名前要素に一意の ID を割り当てて、出力が次のようになるようにするにはどうすればよいですか。

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プログラムを介してこれを行う方法はありますか?

4

1 に答える 1

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>

「レイアウト要素」(表、線、セルなど)にいくつかのダミー要素を使用しました。

これが役立つことを願っています。

于 2013-03-13T18:27:39.080 に答える