如何比较两个xml文件与xslt?

时间:2011-04-05 10:20:54

标签: linux xslt

你好专家 我有2个XML文件,例如:

<college>
    <student>
        <name>amit</name>
        <file>/abc/kk/final.c</file>
        <rollno>22</rollno>
        <function>a()</function>
    </student>
    <student>
        <name>sumit</name>
        <file>/abc/kk/up.h</file>
        <rollno>23</rollno>
        <function>b()</function>
    </student>
    <student>
        <name>nikhil</name>
        <file>/xyz/up.cpp</file>
        <rollno>24</rollno>
        <function>c()</function>
    </student>
    <student>
        <name>bharat</name>
        <file>/abc/kk/down.h</file>
        <rollno>25</rollno>
        <function>d()</function>
    </student>
    <student>
        <name>ajay</name>
        <file>/simple/st.h</file>
        <rollno>27</rollno>
        <function>e()</function>
    </student>
</college>

第二个XML文件

<college>
    <student>
        <name>amit</name>
        <file>/abc/kk/final.c</file>
        <function>a()</function>
    </student>
    <student>
        <name>nikhil</name>
        <file>/xyz/up.cpp</file>
        <function>c()</function>
    </student>
    <student>
        <name>ajay</name>
        <file>/simple/st.h</file>
        <function>e()</function>
    </student>
</college>

我想比较两个XML文件,这样我们就会得到那些不常见的节点的输出。因为我是xslt的新手,请为我提供解决方案。 我正在使用:

<xsl:for-each select="document('1.xml')/college/student[
                         starts-with(file, '/abc/kk')
                      ]">
    <xsl:for-each select="document('2.xml')/college/student">
        <xsl:if test="string(document('1.xml')/college/student/function)
                   != string(document('2.xml')/college/student/function)">
            <tr>
                <td>
                    <xsl:value-of
                     select="document('1.xml')/college/student/name"/>
                </td>
                <td>
                    <xsl:value-of
                     select="document('1.xml')/college/student/file"/>
                </td>
                <td>
                    <xsl:value-of
                     select="document('1.xml')/college/student/function"/>
                </td>
            </tr>
        </xsl:if>
    </xsl:for-each>
</xsl:for-each>

2 个答案:

答案 0 :(得分:0)

使用XSLT将两个XML文件转换为两个纯文本文件,其中只包含您要比较的信息。

然后只是diff两个纯文本列表。

在与sort比较之前,请不要忘记列出diff

答案 1 :(得分:0)

您只需要这个XPath表达式:

document('1.xml')/college/student[
   starts-with(file, '/abc/kk')
][
   not(
      function = document('2.xml')/college/student/function
   )
]

作为证明,这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <table>
            <xsl:apply-templates
             select="college/student[
                        starts-with(file, '/abc/kk')
                     ][
                        not(
                           function=document('2.xml')/college/student/function
                        )
                     ]"/>
        </table>
    </xsl:template>
    <xsl:template match="student">
        <tr>
            <xsl:apply-templates/>
        </tr>
    </xsl:template>
    <xsl:template match="student/*">
        <td>
            <xsl:apply-templates/>
        </td>
    </xsl:template>
</xsl:stylesheet> 

输出:

<table>
    <tr>
        <td>sumit</td>
        <td>/abc/kk/up.h</td>
        <td>23</td>
        <td>b()</td>
    </tr>
    <tr>
        <td>bharat</td>
        <td>/abc/kk/down.h</td>
        <td>25</td>
        <td>d()</td>
    </tr>
</table>