我有两个类似的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>
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>
现在我想对它们进行比较。要么有一个额外的元素(类似于两者),要么有一份新文件(in_both_files.xml,only_in_file1.xml,only_infiles2.xml)。我知道,XSLT不是这个任务的最佳选择,我缺少PHP/SQL。。。解决这个问题的最佳方法是什么?我已经在寻找解决方案,但大多数人似乎很乐意将其合并。我的想法是将每个对象的ID作为attribut,然后遍历第一个文件,并使用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>
那就太好了!此外,可以连续使用(我认为,必须)更多的个人信息!
因此,如果一个对象出现在两个列表上,则它们具有完全相同的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>