XSLT 1.0 переместить дочерние элементы в новый родительский узел

#xml #xslt-1.0

#xml #xslt-1.0

Вопрос:

Ввод XML

     <Location>
        <AdditionalInterest>
            <GeneralPartyInfo>
                <NameInfo>
                    <CommercialName>munmun</CommercialName>
                </NameInfo>
                <Addr>
                    <Addr1>1234 Oak Street</Addr1>
                    <City>Waterville</City>
                    <StateProvCd>ME</StateProvCd>
                </Addr>
            </GeneralPartyInfo>
            <AdditionalInterestInfo>
                <NatureInterestCd>Loss Payee</NatureInterestCd>
            </AdditionalInterestInfo>
            <GeneralPartyInfo>
                <NameInfo>
                    <CommercialName>jaan</CommercialName>
                </NameInfo>
                <Addr>
                    <Addr1>555 Park Avenue</Addr1>
                    <City>Waterville</City>
                    <StateProvCd>ME</StateProvCd>
                </Addr>
            </GeneralPartyInfo>
            <AdditionalInterestInfo>
                <NatureInterestCd>Mortgage Holder</NatureInterestCd>
            </AdditionalInterestInfo>
        </AdditionalInterest>
    </Location>
  

Желаемый выходной XML

     <Location>
        <AdditionalInterest>
            <GeneralPartyInfo>
                <NameInfo>
                    <CommercialName>munmun</CommercialName>
                </NameInfo>
                <Addr>
                    <Addr1>1234 Oak Street</Addr1>
                    <City>Waterville</City>
                    <StateProvCd>ME</StateProvCd>
                </Addr>
            </GeneralPartyInfo>
            <AdditionalInterestInfo>
                <NatureInterestCd>Loss Payee</NatureInterestCd>
            </AdditionalInterestInfo>
        </AdditionalInterest>
        <AdditionalInterest>
            <GeneralPartyInfo>
                <NameInfo>
                    <CommercialName>jaan</CommercialName>
                </NameInfo>
                <Addr>
                    <Addr1>555 Park Avenue</Addr1>
                    <City>Waterville</City>
                    <StateProvCd>ME</StateProvCd>
                </Addr>
            </GeneralPartyInfo>
            <AdditionalInterestInfo>
                <NatureInterestCd>Mortgage Holder</NatureInterestCd>
            </AdditionalInterestInfo>
        </AdditionalInterest>
    </Location>
  

Мне нужно создать отдельные дополнительные родительские узлы, каждый с дочерними узлами GeneralPartyInfo и
AdditionalInterestInfo, как показано в желаемом выходном XML выше. Есть идеи о том, как это сделать с помощью XSLT 1.0? Спасибо!

Ответ №1:

Если можно предположить, что за каждым GeneralPartyInfo сразу следует ровно один AdditionalInterestInfo , то вы могли бы сделать:

XSLT 1.0

 <xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/Location">
    <xsl:copy>
        <xsl:for-each select="AdditionalInterest/GeneralPartyInfo">
             <AdditionalInterest>
                <xsl:copy-of select=". | following-sibling::AdditionalInterestInfo[1]"/>
              </AdditionalInterest>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>