Я пытаюсь объединить два файла с одинаковой структурой и некоторыми данными. Поэтому, если узел имеет одинаковое имя в обоих файлах, новый узел должен быть создан с дочерними элементами обоих исходных узлов. Исходные файлы являются следующие:Объединить XML-файлы с одинаковой структурой и разными данными
file1.xml
<?xml version='1.0' encoding='UTF-8'?>
<BROADRIDGE>
<SECURITY CUSIP='CUSIP1' DESCRIPT='CUSIP1'>
<CUSTOMER ID='M1'/>
<CUSTOMER ID='M2'/>
<CUSTOMER ID='M3'/>
</SECURITY>
<SECURITY CUSIP='CUSIP3' DESCRIPT='CUSIP3'>
<CUSTOMER ID='M4'/>
<CUSTOMER ID='M5'/>
<CUSTOMER ID='M6'/>
</SECURITY>
</BROADRIDGE>
file2.xml
<?xml version='1.0' encoding='UTF-8'?>
<BROADRIDGE>
<SECURITY CUSIP='CUSIP1' DESCRIPT='CUSIP1'>
<CUSTOMER ID='B1'/>
<CUSTOMER ID='B2'/>
<CUSTOMER ID='B3'/>
</SECURITY>
<SECURITY CUSIP='CUSIP2' DESCRIPT='CUSIP2'>
<CUSTOMER ID='B4'/>
<CUSTOMER ID='B5'/>
<CUSTOMER ID='B6'/>
</SECURITY>
</BROADRIDGE>
Идея заключается в том, чтобы создать новый XML-файл с такой же структурой, которая содержит информацию из обоих файлов, объединение этих узлов SECURITY, которые имеют одинаковый атрибут CUSIP. В этом случае результат должен быть следующим:
<?xml version="1.0" encoding="UTF-8"?>
<BROADRIDGE>
<SECURITY CUSIP="CUSIP1">
<CUSTOMER ID="M1"/>
<CUSTOMER ID="M2"/>
<CUSTOMER ID="M3"/>
<CUSTOMER ID='B1'/>
<CUSTOMER ID='B2'/>
<CUSTOMER ID='B3'/>
</SECURITY>
<SECURITY CUSIP="CUSIP3">
<CUSTOMER ID="M4"/>
<CUSTOMER ID="M5"/>
<CUSTOMER ID="M6"/>
</SECURITY>
<SECURITY CUSIP="CUSIP2">
<CUSTOMER ID="B4"/>
<CUSTOMER ID="B5"/>
<CUSTOMER ID="B6"/>
</SECURITY>
</BROADRIDGE>
Я определил феллинг XML, чтобы joing их:
<?xml version="1.0"?>
<MASTERFILE>
<FILE>\file1.xml</FILE>
<FILE>\file2.xml</FILE>
</MASTERFILE>
И следующий XSL для выполнения слияния:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/MASTERFILE">
<BROADRIDGE>
<xsl:variable name="securities" select="document(FILE)/BROADRIDGE/SECURITY"/>
<xsl:for-each select="$securities">
<xsl:if test="generate-id(.) = generate-id($securities[@CUSIP=current()/@CUSIP])">
<SECURITY>
<xsl:attribute name="CUSIP" ><xsl:value-of select="@CUSIP"/></xsl:attribute>
<xsl:for-each select="CUSTOMER">
<CUSTOMER>
<xsl:attribute name="ID" ><xsl:value-of select="@ID"/></xsl:attribute>
</CUSTOMER>
</xsl:for-each>
</SECURITY>
</xsl:if>
</xsl:for-each>
</BROADRIDGE>
</xsl:template>
</xsl:stylesheet>
Но я получаю следующее:
<?xml version="1.0" encoding="UTF-8"?>
<BROADRIDGE>
<SECURITY CUSIP="CUSIP1">
<CUSTOMER ID="M1"/>
<CUSTOMER ID="M2"/>
<CUSTOMER ID="M3"/>
</SECURITY>
<SECURITY CUSIP="CUSIP3">
<CUSTOMER ID="M4"/>
<CUSTOMER ID="M5"/>
<CUSTOMER ID="M6"/>
</SECURITY>
<SECURITY CUSIP="CUSIP2">
<CUSTOMER ID="B4"/>
<CUSTOMER ID="B5"/>
<CUSTOMER ID="B6"/>
</SECURITY>
</BROADRIDGE>
Любая идея, почему это не слияние КЛИЕНТОВ из обоих файлов для БЕЗОПАСНОСТИ с CUSIP = CUSIP1?
Ваш пример XML не показан ... –
Я имею в виду, что XML присоединиться к ним - не file1 и file2 –
Спасибо! Сейчас исправлено –