Как использовать группу в xslt для управления историей

XSLT

<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="/Data/SubjectData/SubjectIND[@AECBInquiryFlag='0' and @AECBConsentFlag='0']">
                    <xsl:variable name="index" select="position()" />
                    <xsl:element name="SubjectIND">
                        <xsl:copy-of select="@*" />
                        <xsl:element name="ExternalSources">
                            <xsl:copy-of select="ExternalSources/@*" />
                            <xsl:element name="UAEbureau">
                                <xsl:attribute name="ResponseId">
                                    <xsl:value-of select="/Data/CIPConnectorOutput/AdapterOutput/AdapterResult/Response[$index]/Report/ResponseId" />
                                </xsl:attribute>
                                <xsl:element name="Contracts">
                                    <xsl:for-each select="/Data/CIPConnectorOutput/AdapterOutput/AdapterResult/Response[$index]/Report/Response/ContractData/Installments/Contract">
                                        <xsl:element name="Contract">
                                            <xsl:attribute name="TotalAmount">
                                                <xsl:value-of select="TotalAmount" />
                                            </xsl:attribute>
                                  <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:element name="Period">
                                              </xsl:element>
                                          </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>

Введите Xml

    <Data>
        <CIPConnectorOutput>
            <AdapterOutput>
                <ResultMessage Code="SUCCESS"/>
                <AdapterResult>
                    <Response DetailID="25480276" ID="1">
                        <Report>
                            <ResponseId>735f28fd-2d04-43c8-bf91-58f295fe132a</ResponseId>
                            <Response>
                                <ContractData>
                                    <Installments>
                                        <Contract>
                                            <TotalAmount>18888</TotalAmount>

                                            <History Year="2018">
                                                <ReferenceDate>032018</ReferenceDate>
                                                <Balance>175000</Balance>
                                                <OverdueAmount>200</OverdueAmount>
                                                <DaysPaymentDelay>2</DaysPaymentDelay>
                                                <ContractStatus>U</ContractStatus>
                                            </History>
                                            <History Year="2018">
                                                <ReferenceDate>032018</ReferenceDate>
                                                <Balance>885000</Balance>
                                                <OverdueAmount>100</OverdueAmount>
                                                <DaysPaymentDelay>1</DaysPaymentDelay>
                                                <ContractStatus>U</ContractStatus>
                                            </History>
                                            <History Year="2018">
                                                <ReferenceDate>012018</ReferenceDate>
                                                <Balance>335000</Balance>
                                                <OverdueAmount>0</OverdueAmount>
                                                <DaysPaymentDelay>0</DaysPaymentDelay>
                                                <ContractStatus>U</ContractStatus>
                                            </History>
                                            <History Year="2017">
                                                <ReferenceDate>122017</ReferenceDate>
                                                <Balance>55554</Balance>
                                            </History>
                                        </Contract>
                                        <Contract>
                                            <TotalAmount>180000</TotalAmount>
                                            <History Year="2018">
                                                <ReferenceDate>032018</ReferenceDate>
                                                <Balance>275000</Balance>
                                                <OverdueAmount>200</OverdueAmount>
                                                <DaysPaymentDelay>2</DaysPaymentDelay>
                                                <ContractStatus>U</ContractStatus>
                                            </History>
                                            <History Year="2017">
                                                <ReferenceDate>022018</ReferenceDate>
                                                <Balance>675000</Balance>
                                                <OverdueAmount>100</OverdueAmount>
                                                <DaysPaymentDelay>1</DaysPaymentDelay>
                                                <ContractStatus>U</ContractStatus>
                                            </History>
                                            <History Year="2015">
                                                <ReferenceDate>012015</ReferenceDate>
                                                <Balance>185000</Balance>
                                                <OverdueAmount>0</OverdueAmount>
                                                <DaysPaymentDelay>0</DaysPaymentDelay>
                                                <ContractStatus>U</ContractStatus>
                                            </History>
                                        </Contract>
                                    </Installments>
                                </ContractData>
                            </Response>
                        </Report>
                    </Response>
                </AdapterResult>
            </AdapterOutput>
        </CIPConnectorOutput>
        <SubjectData>
            <SubjectIND AECBConsentFlag="0" AECBInquiryFlag="0" Age="56" CHMCallDone="" DOB="1963-04-08" EmiratesID="784-1963-5878784-1" FullName="ROSS GIULI" Gender="F" Name="ROSS" NameAR="sdfg" Nationality="UAE" Role="M" Surname="GIULI" SurnameAR="sdfg">
                <ExternalSources />
            </SubjectIND>
        </SubjectData>
    </Data>

Выходной XML

    <?xml version="1.0" encoding="UTF-8"?>
    <Data>
        <SubjectData>
            <SubjectIND AECBConsentFlag="0" AECBInquiryFlag="0" Age="56" CHMCallDone="" DOB="1963-04-08"
                EmiratesID="784-1963-5878784-1" FullName="ROSS GIULI" Gender="F" Name="ROSS"
                NameAR="sdfg" Nationality="UAE" Role="M" Surname="GIULI" SurnameAR="sdfg">
                <ExternalSources>
                    <UAEbureau ResponseId="735f28fd-2d04-43c8-bf91-58f295fe132a">
                        <Contracts>
                            <Contract TotalAmount="18888">
                                <History Year="2018">
                                        <Period RefDate="032018"  Balance="175000" />
                                        <Period RefDate="022018" Balance="885000" />
                                        <Period RefDate="012018" Balance="335000" />
                                </History>
                                <History Year="2017">
                                        <Period RefDate="122017"  Balance="55554" />
                                </History>
                             </Contract>
                            <Contract TotalAmount="180000">
                                 <History Year="2016">
                                        <Period RefDate="032018"  Balance="275000" />
                                        <Period RefDate="022018" Balance="675000" />

                                </History>
                                <History Year="2015">
                                        <Period RefDate="012015" Balance="185000" />
                                </History>
                            </Contract>
                        </Contracts>
                    </UAEbureau>
                </ExternalSources>
            </SubjectIND>
        </SubjectData>
    </Data>

я хочу сгруппировать по годам в xslt, пожалуйста, найдите ниже входной образец xsl и ожидаемый результат. пожалуйста, помогите любым решением. я пробовал с xsl ниже, но не работает, дайте мне знать, если у кого-нибудь есть альтернативное решение для этого. я требую, чтобы он использовал xslt 1.0, а не 2.0 Количество истории, которое нужно разделить по годам, и вывод будет показан ниже.


person Nikhil Karande    schedule 28.08.2019    source источник
comment
Я предлагаю вам попробовать еще раз после прочтения этого: jenitennison.com/xslt/grouping/muenchian. html   -  person michael.hor257k    schedule 28.08.2019
comment
Голосование за закрытие, потому что это, кажется, совершенно стандартный вопрос о группировке XSLT 1.0 без существенных отличий от всех других вопросов о группировке на этом сайте. Я выбрал один из них в качестве дубликата, но вы, вероятно, захотите взглянуть на другие или, что еще лучше, на стандартный справочник по XSLT. Обратите внимание, что группировка в XSLT 2.0 НАМНОГО проще, а использование процессора 1.0 (Xalan) через 20 лет после создания 1.0 в наши дни кажется довольно луддитским.   -  person Michael Kay    schedule 28.08.2019
comment
@MichaelKay это не дубликат, если у вас есть решение, предоставьте его, но помните, пожалуйста, не отмечайте его как дубликат. группировка в xslt может быть похожей, но здесь я хочу выводить по-другому, как описано в описании   -  person Nikhil Karande    schedule 06.09.2019