J'essaie de fusionner deux fichiers qui ont la même structure, et quelques données en commun. Donc si un noeud a le même nom dans les deux fichiers, un nouveau noeud doit être créé avec les enfants des deux noeuds originaux. Les fichiers originaux sont les suivants :
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>
L'idée est de créer un nouveau fichier XML avec la même structure qui contient les informations des deux fichiers, en fusionnant les nœuds SECURITY qui ont le même attribut CUSIP. Dans ce cas, le résultat devrait être le suivant :
<?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>
J'ai défini le xml suivant pour les rejoindre :
<?xml version="1.0"?>
<MASTERFILE>
<FILE>\file1.xml</FILE>
<FILE>\file2.xml</FILE>
</MASTERFILE>
Et le XSL suivant pour faire la fusion :
<?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>
Mais j'obtiens ce qui suit :
<?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>
Une idée de la raison pour laquelle il ne fusionne pas les CLIENTS des deux fichiers pour SECURITE avec CUSIP =. CUSIP1 ?