Объединение элементов в XSLT-преобразовании - PullRequest
0 голосов
/ 27 сентября 2019

У меня ниже xml ввода и я хочу преобразовать его в один элемент, пожалуйста, пройдите ввод и ожидаемый вывод и предоставьте любое решение.требуется XSLT 1.0

, входной xml как указано ниже

`<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <PrintableDocument>
        <SubjectData>
            <SubjectIND AECBBureauHitResponseStatus="Hit" AECBConsentFlag="0" AECBInquiryFlag="0"
                Age="26" CHMCallDone="" CHMConsentFlag="0" CHMInquiryFlag="0" DOB="1993-08-04"
                EmiratesID="784-1993-5878784-1" FullName="ROSS GIULI" Gender="F" Name="ROSS"
                Nationality="UAE" PdtDone="0" Role="M" Surname="GIULI">
                <ExternalSources>
                    <UAEbureau AECBBureauHitResponseStatus="Hit" AECBConsentFlag="0"
                        AECBInquiryFlag="0" Age="26" CHMCallDone="" CHMConsentFlag="0"
                        CHMInquiryFlag="0" DOB="1993-08-04" EmiratesID="784-1993-5878784-1"
                        FullName="ROSS GIULI" Gender="F" Name="ROSS" Nationality="UAE" PdtDone="0"
                        Role="M" Surname="GIULI">
                        <Contracts>
                            <Contract TotalAmount="12000" >
                                <History Year="2018">
                                    <Period ReferenceDate="012018" Balance="444"
                                        OverdueAmount="200" DaysPaymentDelay="8" ContractStatus="U"></Period>
                                    <Period ReferenceDate="012018" Balance="885000"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022018" Balance="885000"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                                <History Year="2017">
                                    <Period ReferenceDate="022017" Balance="25000"
                                        OverdueAmount="50" DaysPaymentDelay="0" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022017" Balance="777" OverdueAmount="50"
                                        DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                            </Contract>
                            <Contract TotalAmount="12000" >
                                <History Year="2018">
                                    <Period ReferenceDate="012017" Balance="222"
                                        OverdueAmount="200" DaysPaymentDelay="8" ContractStatus="U"></Period>
                                    <Period ReferenceDate="012017" Balance="123"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022017" Balance="8987"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                                <History Year="2017">
                                    <Period ReferenceDate="022018" Balance="121"
                                        OverdueAmount="50" DaysPaymentDelay="0" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022018" Balance="2311" OverdueAmount="50"
                                        DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                            </Contract>
                        </Contracts>
                    </UAEbureau>
                </ExternalSources>
            </SubjectIND>
        </SubjectData>
    </PrintableDocument>
</Data>
`

ожидаемый результат будет как ниже

`<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <PrintableDocument>
        <SubjectData>
            <SubjectIND AECBBureauHitResponseStatus="Hit" AECBConsentFlag="0" AECBInquiryFlag="0"
                Age="26" CHMCallDone="" CHMConsentFlag="0" CHMInquiryFlag="0" DOB="1993-08-04"
                EmiratesID="784-1993-5878784-1" FullName="ROSS GIULI" Gender="F" Name="ROSS"
                Nationality="UAE" PdtDone="0" Role="M" Surname="GIULI">
                <ExternalSources>
                    <UAEbureau AECBBureauHitResponseStatus="Hit" AECBConsentFlag="0"
                        AECBInquiryFlag="0" Age="26" CHMCallDone="" CHMConsentFlag="0"
                        CHMInquiryFlag="0" DOB="1993-08-04" EmiratesID="784-1993-5878784-1"
                        FullName="ROSS GIULI" Gender="F" Name="ROSS" Nationality="UAE" PdtDone="0"
                        Role="M" Surname="GIULI">
                        <Contracts>
                            <Contract TotalAmount="12000" >
                                <History Year="2018">
                                    <Period ReferenceDate="012018" Balance="444"
                                        OverdueAmount="200" DaysPaymentDelay="8" ContractStatus="U"></Period>
                                    <Period ReferenceDate="012018" Balance="885000"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022018" Balance="885000"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                                <History Year="2017">
                                    <Period ReferenceDate="022018" Balance="25000"
                                        OverdueAmount="50" DaysPaymentDelay="0" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022018" Balance="777" OverdueAmount="50"
                                        DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                            </Contract>
                            <Contract TotalAmount="12000" >
                                <History Year="2018">
                                    <Period ReferenceDate="012018" Balance="222"
                                        OverdueAmount="200" DaysPaymentDelay="8" ContractStatus="U"></Period>
                                    <Period ReferenceDate="012018" Balance="123"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022018" Balance="8987"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                                <History Year="2017">
                                    <Period ReferenceDate="022018" Balance="121"
                                        OverdueAmount="50" DaysPaymentDelay="0" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022018" Balance="2311" OverdueAmount="50"
                                        DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                            </Contract>
                        </Contracts>
                        <ConsolidatedHistory>
                                <History Year="2018">
                                    <Period ReferenceDate="012018" Balance="444"
                                        OverdueAmount="200" DaysPaymentDelay="8" ContractStatus="U"></Period>
                                    <Period ReferenceDate="012018" Balance="885000"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022018" Balance="885000"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                        <Period ReferenceDate="012018" Balance="222"
                                        OverdueAmount="200" DaysPaymentDelay="8" ContractStatus="U"></Period>
                                    <Period ReferenceDate="012018" Balance="123"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022018" Balance="8987"
                                        OverdueAmount="100" DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                                <History Year="2017">
                                    <Period ReferenceDate="022017" Balance="25000"
                                        OverdueAmount="50" DaysPaymentDelay="0" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022017" Balance="777" OverdueAmount="50"
                                        DaysPaymentDelay="1" ContractStatus="U"></Period>
                                         <Period ReferenceDate="022017" Balance="121"
                                        OverdueAmount="50" DaysPaymentDelay="0" ContractStatus="U"></Period>
                                    <Period ReferenceDate="022017" Balance="2311" OverdueAmount="50"
                                        DaysPaymentDelay="1" ContractStatus="U"></Period>
                                </History>
                        </ConsolidatedHistory>
                    </UAEbureau>
                </ExternalSources>
            </SubjectIND>
        </SubjectData>
    </PrintableDocument>
</Data>
`

пример кода xslt

`<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xalan="http://xml.apache.org/xalan" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="Data">
        <xsl:element name="Data">
            <xsl:call-template name="SubjectData" />
        </xsl:element>
    </xsl:template>
    <xsl:template name="SubjectData">
        <xsl:element name="SubjectData">
            <xsl:for-each select="SubjectData/SubjectIND">
                <xsl:element name="SubjectIND">
                    <xsl:copy-of select="@*"/>
                    <xsl:copy-of select="*[name()!='ExternalSources']" />
                    <xsl:element name="ExternalSources">
                        <xsl:element name="UAEbureau">
                            <xsl:copy-of select="ExternalSources/UAEbureau/@*"/>
                            <xsl:copy-of select="*[name()!='Contracts']" />
                            <xsl:element name="Contracts">
                                <xsl:for-each select="ExternalSources/UAEbureau/Contracts/Contract">
                                    <xsl:element name="Contract">
                                        <xsl:copy-of select="@*"/>
                                        <xsl:copy-of select="CommonInfo"/>
                                        <xsl:for-each select="History">
                                            <xsl:sort select="@Year" order="descending"/>
                                            <xsl:variable name="key" select="@Year"/>
                                            <xsl:if test="not(preceding-sibling::History[@Year=$key])">
                                                <xsl:element name="History">
                                                    <xsl:attribute name="Year"><xsl:value-of select="@Year"/></xsl:attribute>
                                                    <xsl:for-each select="../History[@Year=$key]">
                                                        <xsl:element name="Period">
                                                            <xsl:attribute name="ReferenceDate"><xsl:value-of select="@ReferenceDate"/></xsl:attribute>
                                                            <xsl:attribute name="Balance"><xsl:value-of select="@Balance"/></xsl:attribute>
                                                            <xsl:attribute name="OverdueAmount"><xsl:value-of select="@OverdueAmount"/></xsl:attribute>
                                                            <xsl:attribute name="DaysPaymentDelay"><xsl:value-of select="@DaysPaymentDelay"/></xsl:attribute>
                                                            <xsl:attribute name="ContractStatus"><xsl:value-of select="@ContractStatus"/></xsl:attribute>
                                                        </xsl:element>
                                                    </xsl:for-each>
                                                </xsl:element>
                                            </xsl:if>
                                        </xsl:for-each>
                                    </xsl:element>
                                </xsl:for-each>
                            </xsl:element>
                        </xsl:element>
                    </xsl:element>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>`

здесь Контракт будет 1 ко многим, а История контракта также зависит от года.Пожалуйста, предложите любой подход к следующей ситуации.

...