要件;
トップレベルからの応答として一意のグループを送信する必要があります。
一意性条件:
<partyfund>
グループ内に2 つのグループが<request>
あり、各<partyfund>
グループに同一の要素とサブグループがある場合は、重複する<partyfund>
グループを削除します。<fund>
グループ内に複数のグループ<partyfund>
があり、各<fund>
グループに同一の要素とサブグループがある場合は、重複する<fund>
グループを削除します。<fundcollection>
グループ内に複数のグループ<fund>
があり、各<fundcollection>
グループに同一の要素とサブグループがある場合は、重複する<fundcollection>
グループを削除します。<valuewithcode>
グループ内に複数のグループ<fundcollection>
があり、各<valuewithcode>
グループに同一の要素がある場合は、重複するグループを削除します。<fundcollection>
グループ内で andとand<valuewithcode>
が 2 回来て、グループ間でそれらのいずれかに違いがある場合、両方を出力として送信する必要があるとします。<valuecodeA>
<valuecodeB>
<valuecodeC>
<valuewithcode>
<valuewithcode>
<partyfundcode>
一意性のために、とその関連グループが一意であることを確認して ください。
<fundclass>
および<funddate>
その関連グループ<fund>
は一意である必要があります。
<fundcode>
およびその関連グループ<fundcollection>
は一意である必要があります
<valuecodeA> <valuecodeB> <valuecodeC>
およびその関連グループ<valuewithcode>
は一意である必要があります
重複ノードの金額を計算する必要があります。
要件を説明しようとしました。
<fund>
また、サンプルxmlで以下のコードを試して結果を得ましたが、要素をレベルでグループ化していません。これについて助けてください。
入力 XML:
<request>
<party>
<partyfund>
<partyfundcode>PFC</partyfundcode>
<fund>
<fundclass>1</fundclass>
<funddate>2001-01-01</funddate>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
</fund>
<fund>
<fundclass>1</fundclass>
<funddate>2001-01-01</funddate>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
</fund>
<fund>
<fundclass>1</fundclass>
<funddate>2001-01-01</funddate>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>44444</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
</fund>
</partyfund>
</party>
</request>
私のコードからの実際の出力
<request>
<partyfund>
<partyfundcode>PFC</partyfundcode>
<fund>
<fundclass>1</fundclass>
<funddate>2001-01-01</funddate>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>40</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>44444</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
</fund>
<fund>
<fundclass>1</fundclass>
<funddate>2001-01-01</funddate>
</fund>
<fund>
<fundclass>1</fundclass>
<funddate>2001-01-01</funddate>
</fund>
</partyfund>
</request>
期待される結果は
<request>
<partyfund>
<partyfundcode>PFC</partyfundcode>
<fund>
<fundclass>1</fundclass>
<funddate>2001-01-01</funddate>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>40</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
</fund>
<fund>
<fundclass>1</fundclass>
<funddate>2001-01-01</funddate>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>10</amount>
<valuecodeA>44444</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
<fundcollection>
<fundcode>CFL</fundcode>
<valuewithcode>
<amount>20</amount>
<valuecodeA>200012DS</valuecodeA>
<valuecodeB>200011GH</valuecodeB>
<valuecodeC>200014UT</valuecodeC>
</valuewithcode>
</fundcollection>
</fund>
</partyfund>
</request>
変換に使用されるコード
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="partyfund-check" match="partyfund" use="concat(partyfundcode,'+',fund)"/>
<xsl:key name="fund-check" match="fund" use="concat(../partyfundcode,'+',funddate,'+',fundclass)"/>
<xsl:key name="fundcollection-check" match="fundcollection" use="concat(../../partyfundcode,'+',../funddate,'+',../fundclass,'+',fundcode)"/>
<xsl:key name="fundcollection-check1" match="fundcollection" use="concat(../../partyfundcode,'+',../funddate,'+',../fundclass,'+',fundcode,'+',.)"/>
<xsl:key name="valuewithcode-check" match="valuewithcode" use="concat(../../../partyfundcode,'+',../../funddate,'+',../../fundclass,'+',../fundcode,'+',valuecodeA, '+', valuecodeB,'+',valuecodeC,'+',../../fundcollection)"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="party">
<xsl:for-each select="partyfund[generate-id(.)=generate-id(key('partyfund-check',concat(partyfundcode,'+',fund))[1])]">
<xsl:for-each select="key('partyfund-check',concat(partyfundcode,'+',fund))">
<partyfund>
<xsl:copy-of select="partyfundcode"/>
<xsl:for-each select="fund[generate-id(.)=generate-id(key('fund-check',concat(../partyfundcode,'+',funddate,'+',fundclass))[1])]">
<xsl:for-each select="key('fund-check',concat(../partyfundcode,'+',funddate,'+',fundclass))">
<fund>
<xsl:copy-of select="fundclass"/>
<xsl:copy-of select="funddate"/>
<xsl:for-each select="fundcollection[generate-id(.)=generate-id(key('fundcollection-check',concat(../../partyfundcode,'+',../funddate,'+',../fundclass,'+',fundcode))[1])]">
<xsl:for-each select="key('fundcollection-check',concat(../../partyfundcode,'+',../funddate,'+',../fundclass,'+',fundcode))[generate-id(.)=generate-id(key('fundcollection-check1',concat(../../partyfundcode,'+',../funddate,'+',../fundclass,'+',fundcode,'+',.))[1])]">
<fundcollection>
<xsl:copy-of select="fundcode"/>
<xsl:for-each select="valuewithcode[generate-id(.)=generate-id(key('valuewithcode-check',concat(../../../partyfundcode,'+',../../funddate,'+',../../fundclass,'+',../fundcode,'+',valuecodeA, '+', valuecodeB,'+',valuecodeC,'+',../../fundcollection))[1])]">
<xsl:for-each select="key('valuewithcode-check',concat(../../../partyfundcode,'+',../../funddate,'+',../../fundclass,'+',../fundcode,'+',valuecodeA, '+', valuecodeB,'+',valuecodeC,'+',../../fundcollection))[1]">
<valuewithcode>
<amount>
<xsl:value-of select="sum(key('valuewithcode-check',concat(../../../partyfundcode,'+',../../funddate,'+',../../fundclass,'+',../fundcode,'+',valuecodeA, '+', valuecodeB,'+',valuecodeC,'+',../../fundcollection))/amount)"/>
</amount>
<xsl:copy-of select="valuecodeA"/>
<xsl:copy-of select="valuecodeB"/>
<xsl:copy-of select="valuecodeC"/>
</valuewithcode>
</xsl:for-each>
</xsl:for-each>
</fundcollection>
</xsl:for-each>
</xsl:for-each>
</fund>
</xsl:for-each>
</xsl:for-each>
</partyfund>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>