XSLT - 比较两个相似的 XML 文件

Dom*_*ino 1 xml xslt diff compare file

我有两个与此类似的 XML 文件:

1.

<data>
   <object ID="1">
      <ID>1</ID>
      <name>abc</name>
      <weight>50</weight>
   </object>
   <object ID="2">
      <ID>2</ID>
      <name>def</name>
      <weight>75</weight>
   </object>
</data>
Run Code Online (Sandbox Code Playgroud)

2.

<data>
   <object ID="2">
      <ID>2</ID>
      <name>def</name>
      <weight>75</weight>
   </object>
   <object ID="3">
      <ID>3</ID>
      <name>ghi</name>
      <weight>100</weight>
   </object>
</data>
Run Code Online (Sandbox Code Playgroud)

现在我想比较它们。使用附加元素(类似于两者)或新文件(in_both_files.xml、only_in_file1.xml、only_in_file2.xml)。我知道,XSLT 不是这个任务的最佳选择,我缺少 PHP/SQL ......解决这个问题的最佳方法是什么?我已经在寻找解决方案,但大多数人似乎很乐意合并它。我的想法是将每个对象的 ID 作为属性,然后遍历第一个文件并使用 document() 和 key() 在另一个文件中查找相同的对象。这很好/甚至可能吗?现在还没有工作,我不知道,这是否是正确的方法。

编辑:这是为了盘点。根据系统,一个 XML 文件是我们拥有的对象,另一个是仓库中真正的对象。因此,如果一个对象出现在两个列表中,则它们具有绝对相同的 ID、名称、重量等。但 ID 是唯一的,这对于每个对象都是绝对唯一的(但当然应该在两个文件中)。所以我需要知道,哪些对象在仓库中但不在系统中,以便我可以导入它们,哪些对象在系统中但不在仓库中,因此必须标记为“丢失”。

所以只是合并它们,无济于事......

结果像

only_in_system.xml
<data>
   <object>
      <ID>1</ID>
      <name>abc</name>
      <weight>50</weight>
   </object>
</data>

only_in_depot.xml
<data>
   <object>
      <ID>3</ID>
      <name>ghi</name>
      <weight>100</weight>
   </object>
</data>

(additional) everything_is_ok.xml
<data>
   <object>
      <ID>2</ID>
      <name>def</name>
      <weight>75</weight>
   </object>
</data>
Run Code Online (Sandbox Code Playgroud)

会好的!还可以连续使用更多的个人转换(我认为,必须)!

mic*_*57k 5

因此,如果一个对象出现在两个列表中,则它们具有绝对相同的 ID、名称、重量等。

好吧,这真的让它变得相当简单:

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

<xsl:variable name="file2" select="document('file2.xml')" />

<xsl:variable name="IDs1" select="/data/object/ID" />
<xsl:variable name="IDs2" select="$file2/data/object/ID" />

<xsl:template match="/data">
<result>
    <data desc="only in file1">
        <xsl:apply-templates select="object[not(ID=$IDs2)]"/>
    </data>
    <data desc="only in file2">
        <xsl:apply-templates select="$file2/data/object[not(ID=$IDs1)]"/>
    </data>
    <data desc="in both files">
        <xsl:apply-templates select="object[ID=$IDs2]"/>
    </data>
</result>
</xsl:template>

<xsl:template match="object">
    <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)