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

#xml #xslt-1.0

#xml #xslt-1.0

Вопрос:

Введите XML

  <Location>
    <LocationNumber>1</LocationNumber>
    <SublocationNumber>1</SublocationNumber>
    <Construction>
        <YearBuilt>2018</YearBuilt>
    </Construction>
    <AdditionalInterest>
        <GeneralPartyInfo>
            <NameInfo>
                <CommercialName>Joe Smith</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>Susan Jones</CommercialName>
            </NameInfo>
            <Addr>
                <Addr1>555 Park Avenue</Addr1>
                <City>Waterville</City>
                <StateProvCd/>
            </Addr>
        </GeneralPartyInfo>
        <AdditionalInterestInfo>
            <NatureInterestCd>Mortgage Holder</NatureInterestCd>
        </AdditionalInterestInfo>
        <GeneralPartyInfo>
            <NameInfo>
                <CommercialName>PNC Bank</CommercialName>
            </NameInfo>
            <Addr>
                <Addr1>2000 Money Street</Addr1>
                <City>Mason</City>
                <StateProvCd/>
            </Addr>
        </GeneralPartyInfo>
        <AdditionalInterestInfo>
            <NatureInterestCd>Additional Interest</NatureInterestCd>
        </AdditionalInterestInfo>
    </AdditionalInterest>
</Location>
 

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

 <Location>
    <LocationNumber>1</LocationNumber>
    <SublocationNumber>1</SublocationNumber>
    <Construction>
        <YearBuilt>2018</YearBuilt>
    </Construction>
    <AdditionalInterest>
        <GeneralPartyInfo>
            <NameInfo>
                <CommercialName>Joe Smith</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>Susan Jones</CommercialName>
            </NameInfo>
            <Addr>
                <Addr1>555 Park Avenue</Addr1>
                <City>Waterville</City>
                <StateProvCd>ZZ</StateProvCd>
            </Addr>
        </GeneralPartyInfo>
        <AdditionalInterestInfo>
            <NatureInterestCd>Mortgage Holder</NatureInterestCd>
        </AdditionalInterestInfo>
    </AdditionalInterest>
    <AdditionalInterest>
        <GeneralPartyInfo>
            <NameInfo>
                <CommercialName>PNC Bank</CommercialName>
            </NameInfo>
            <Addr>
                <Addr1>2000 Money Street</Addr1>
                <City>Mason</City>
                <StateProvCd>ZZ</StateProvCd>
            </Addr>
        </GeneralPartyInfo>
        <AdditionalInterestInfo>
            <NatureInterestCd>Additional Interest</NatureInterestCd>
        </AdditionalInterestInfo>
    </AdditionalInterest>
</Location>
 

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

Комментарии:

1. Было бы здорово, если бы вы могли предоставить минимальный воспроизводимый пример: (1) Входной XML. (2) Ваша логика и XSLT, который пытался ее реализовать. (3) Желаемый результат. (4) Процессор XSLT и его версия.

Ответ №1:

  <xsl:template match="AdditionalInterest">
    <xsl:apply-templates select="GeneralPartyInfo"/>
  </xsl:template>

  <xsl:template match="GeneralPartyInfo">
    <xsl:element name="AdditionalInterest">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
      <xsl:apply-templates select="following-sibling::AdditionalInterestInfo[1]"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
 

Комментарии:

1. Пожалуйста, не применяйте ответы только для кода — добавьте некоторое описание, чтобы квалифицировать ваше решение.