-1

要件;

トップレベルからの応答として一意のグループを送信する必要があります。

一意性条件:

  1. <partyfund>グループ内に2 つのグループが<request>あり、各<partyfund>グループに同一の要素とサブグループがある場合は、重複する<partyfund>グループを削除します。

  2. <fund>グループ内に複数のグループ<partyfund>があり、各<fund>グループに同一の要素とサブグループがある場合は、重複する<fund>グループを削除します。

  3. <fundcollection>グループ内に複数のグループ<fund>があり、各<fundcollection>グループに同一の要素とサブグループがある場合は、重複する<fundcollection>グループを削除します。

  4. <valuewithcode>グループ内に複数のグループ<fundcollection>があり、各<valuewithcode>グループに同一の要素がある場合は、重複するグループを削除します。

  5. <fundcollection>グループ内で andとand<valuewithcode>が 2 回来て、グループ間でそれらのいずれかに違いがある場合、両方を出力として送信する必要があるとします。<valuecodeA><valuecodeB><valuecodeC><valuewithcode><valuewithcode>

  6. <partyfundcode>一意性のために、とその関連グループが一意であることを確認して ください。

<fundclass>および<funddate>その関連グループ<fund>は一意である必要があります。

<fundcode>およびその関連グループ<fundcollection>は一意である必要があります

<valuecodeA> <valuecodeB> <valuecodeC>およびその関連グループ<valuewithcode>は一意である必要があります

  1. 重複ノードの金額を計算する必要があります。

    要件を説明しようとしました。<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>
4

1 に答える 1

1

キーを生成し、この例のようなグループを使用することを検討してください

XSLTでのグループ化

これは、一意の値などを選択するのに役立ちます。

于 2012-11-19T23:41:03.473 に答える