Как сравнить два XML-файлов с XSLT? - PullRequest
1 голос
/ 05 апреля 2011

Привет, эксперты. У меня есть 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>

2-й 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 голосов
/ 15 апреля 2011

Вы хотите только это выражение 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>
0 голосов
/ 05 апреля 2011

Используйте XSLT для преобразования двух файлов XML в два простых текстовых файла, которые содержат только информацию, которую вы хотите сравнить.

Затем просто diff два списка простого текста.не забудьте sort списки перед сравнением с diff.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...