2014-01-15 3 views
1

У меня есть два XML-файлы, похожее на это:XSLT - Сравнение двух similarXML файлов

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_in_file2.xml). Я знаю, что XSLT не лучший для этого квеста, мне не хватает PHP/SQL ... Какой был бы лучший способ решить эту проблему? Я уже искал решение, но большинство людей, похоже, с удовольствием просто сливают его. Моя идея состояла в том, чтобы предоставить каждому объекту идентификатор как атрибут, а затем пройти первый файл и использовать document() и key() для поиска одного и того же объекта в другом файле. Это хорошо/возможно? Не работает до сих пор, и я не знаю, правильно ли это.

Редактировать: Это для инвентаризации. Один XML-файл - это объекты, которые мы имеем, в соответствии с системой, а другой - то, что действительно находится на складе. Поэтому, если один объект появляется в обоих списках, они имеют абсолютный одинаковый идентификатор, имя, вес и т. Д. Но идентификатор - это единственное, абсолютное уникальное для каждого объекта (но, конечно, должно быть в обоих файлах). Поэтому мне нужно знать, какой объект находится на складе, но не в системе, поэтому я могу импортировать их, а какие - в систему, но не в депо, и поэтому должен быть labeld как «потерянный».

Так что их слияние, не поможет ...

В результате, как

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> 

было бы хорошо! Кроме того, можно использовать более индивидуальные трансморкции (и я думаю, придется) в ряд!

+0

Будет ли слияние файлом с идентификатором объекта 2 не дублироваться? –

+0

Можете ли вы определить точные правила такого сравнения, пожалуйста? Если только проверка того, что '' с тем же '' существует в файле1/file2/both, независимо от содержимого объекта (кроме элемента ID), это не должно быть слишком сложно сделать, Я думаю. –

ответ

4

Так что, если в обоих списках один объект, они имеют абсолютную же 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> 
Смежные вопросы