如何使用 xslt 基于唯一字段将重复的 xml 元素合并到单个 xml 元素中

How to merge repeating xml elements in a single xml element based on unique a field using xslt

我有一个场景,我需要根据唯一字段将 XML 元素合并到单个根元素中。

要求:

     <?xml version = "1.0" encoding = "UTF-8"?>
<ns0:klanten xmlns:ns0 = "http://integratie.com/typen/klant/klantmvs/1.0">
    <ns0:klant xmlns:ns0 = "http://integratie.com/typen/klant/klantmvs/1.0">
        <ns0:klantId MVS = "36301586">36301586</ns0:klantId>
        <ns0:accounts>
            <ns0:account>
                <ns0:accountVolgnummer>3</ns0:accountVolgnummer>
                <ns0:betaalwijze>AGI</ns0:betaalwijze>
                <ns0:classificatie>B2C</ns0:classificatie>
                <ns0:gewensteNotaMedium>VZD</ns0:gewensteNotaMedium>
                <ns0:bankrekening>
                    <ns0:bankrekeningnummer>BNGH0285108743</ns0:bankrekeningnummer>
                    <ns0:bankrekeninghouder/>
                    <ns0:bankrekeningland/>
                    <ns0:financieleInstelling/>
                    <ns0:standaardrekeningIndicator>true</ns0:standaardrekeningIndicator>
                </ns0:bankrekening>
                <ns0:startdatum>2014-06-05</ns0:startdatum>
                <ns0:einddatum>2014-07-25</ns0:einddatum>
                </ns0:account>
        </ns0:accounts>
    </ns0:klant>
    <ns0:klant xmlns:ns0 = "http://integratie.com/typen/klant/klantmvs/1.0">
        <ns0:klantId MVS = "36301586">36301586</ns0:klantId>
        <ns0:accounts>
            <ns0:account>
                <ns0:accountVolgnummer>464</ns0:accountVolgnummer>
                <ns0:betaalwijze>AGI</ns0:betaalwijze>
                <ns0:classificatie>B2C</ns0:classificatie>
                <ns0:gewensteNotaMedium>VZD</ns0:gewensteNotaMedium>
                <ns0:bankrekening>
                    <ns0:bankrekeningnummer>BNGH0285108743</ns0:bankrekeningnummer>
                    <ns0:bankrekeninghouder/>
                    <ns0:bankrekeningland/>
                    <ns0:financieleInstelling/>
                    <ns0:standaardrekeningIndicator>true</ns0:standaardrekeningIndicator>
                </ns0:bankrekening>
                <ns0:startdatum>2014-12-12</ns0:startdatum>
                <ns0:einddatum>2015-03-09</ns0:einddatum>           
            </ns0:account>
        </ns0:accounts>
    </ns0:klant>
</ns0:klanten>

期望输出:

<?xml version = "1.0" encoding = "UTF-8"?>
<ns0:klanten xmlns:ns0 = "http://integratie.com/typen/klant/klantmvs/1.0">
<ns0:klant xmlns:ns0 = "http://integratie.com/typen/klant/klantmvs/1.0">
        <ns0:klantId MVS = "36301586">36301586</ns0:klantId>
        <ns0:accounts>
            <ns0:account>
                <ns0:accountVolgnummer>464</ns0:accountVolgnummer>
                <ns0:betaalwijze>AGI</ns0:betaalwijze>
                <ns0:classificatie>B2C</ns0:classificatie>
                <ns0:gewensteNotaMedium>VZD</ns0:gewensteNotaMedium>
                <ns0:bankrekening>
                    <ns0:bankrekeningnummer>BNGH0285108743</ns0:bankrekeningnummer>
                    <ns0:bankrekeninghouder/>
                    <ns0:bankrekeningland/>
                    <ns0:financieleInstelling/>
                    <ns0:standaardrekeningIndicator>true</ns0:standaardrekeningIndicator>
                </ns0:bankrekening>
                <ns0:startdatum>2014-12-12</ns0:startdatum>
                <ns0:einddatum>2015-03-09</ns0:einddatum>
            </ns0:account>
            <ns0:account>
                <ns0:accountVolgnummer>3</ns0:accountVolgnummer>
                <ns0:betaalwijze>AGI</ns0:betaalwijze>
                <ns0:classificatie>B2C</ns0:classificatie>
                <ns0:gewensteNotaMedium>VZD</ns0:gewensteNotaMedium>
                <ns0:bankrekening>
                    <ns0:bankrekeningnummer>BNGH0285108743</ns0:bankrekeningnummer>
                    <ns0:bankrekeninghouder/>
                    <ns0:bankrekeningland/>
                    <ns0:financieleInstelling/>
                    <ns0:standaardrekeningIndicator>true</ns0:standaardrekeningIndicator>
                </ns0:bankrekening>
                <ns0:startdatum>2014-06-05</ns0:startdatum>
                <ns0:einddatum>2014-07-25</ns0:einddatum>
                </ns0:account>
        </ns0:accounts>
    </ns0:klant>
</ns0:klanten>

我正在尝试在 tibco 中实现它,但没有成功。谁能帮我写 xslt 吗?

您可以尝试这样的操作:使用密钥获取不同的 ID,并使用这些不同的 ID 遍历 klantId 个节点。选择他们的帐户数据。

我敢肯定周围有人可以用一半的线解决这个问题,但它似乎准备了你需要的东西:

此处测试:http://www.utilities-online.info/xsltransformation/#.VlzGqNgveUl

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
    version="1.0" xmlns:ns0="http://integratie.com/typen/klant/klantmvs/1.0">
    <xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no" />

    <xsl:key name="IDs" match="/ns0:klanten/ns0:klant/ns0:klantId" use="@MVS" />

    <xsl:template match="/">
        <ns0:klanten>
            <xsl:for-each select="//ns0:klantId[generate-id()=generate-id(key('IDs',.)[1])]">
                <xsl:variable name="currentId" select="." />
                <ns0:klant>
                    <ns0:klantid mvs="{$currentId}">
                        <xsl:value-of select="$currentId" />
                    </ns0:klantid>
                    <ns0:accounts>
                        <xsl:for-each select="//ns0:klantId[@MVS=$currentId]">
                            <xsl:copy-of select="../ns0:accounts/ns0:account" />
                        </xsl:for-each>
                    </ns0:accounts>
                </ns0:klant>
            </xsl:for-each>
        </ns0:klanten>
    </xsl:template>
</xsl:stylesheet>