使用xslt比较两个xml文件

时间:2015-04-17 09:42:14

标签: xml xslt

我有两个XML文件:

文件" a":

<?xml version="1.0"?>
 <catalog>
  <cd>d</cd>
  <cd>e</cd>
  <cd>f</cd>
  <cd>c</cd>
</catalog>

文件&#34; b&#34;:

<?xml version="1.0"?>
<catalog>
  <cd>a</cd>
  <cd>b</cd>
  <cd>c</cd>
</catalog>

我想将文件b与文件a进行比较,并获取仅存在于文件b中的记录。

即。预期产出是:

<?xml version="1.0"?>
 <catalog>
  <cd>a</cd>
  <cd>b</cd>
</catalog>

2 个答案:

答案 0 :(得分:2)

如果您可以使用XSLT 2.0,那么可以使用非常简单(并且有效)地完成此操作。假设您正在处理“b”文件:

XSLT 2.0

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="cd" match="cd" use="." />

<xsl:template match="/catalog">
    <xsl:copy>
        <xsl:copy-of select="cd[not(key('cd', ., document('a.xml')))]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

一个简单的解决方案如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:param name="compareWith" select="'a.xml'"/>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="cd">
        <xsl:if test="not(document($compareWith)//cd = .)">
            <xsl:copy>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

重点是我们检查要比较的文档中是否存在实际的cd内容($compareWith