Вложенные XSLT-шаблоны не отображаются во вложенном XML-файле. - PullRequest
0 голосов
/ 27 сентября 2019

У меня проблемы с вложением элементов с использованием XSLT.

Я прочитал введите описание ссылки здесь , похоже, это та же проблема, что и у меня, но я не могу заставить ее работать должным образом.

Мой XSLT (упрощенный)

        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" indent="yes"/>
      <!--https://www.onenaught.com/posts/23/xslt-tips-for-cleaner-code-and-better-performance#toc-avoid-xslfor-each-use-template-match -->
      <xsl:template match="/">
        <Root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.aca.nl/schema/weborder">
          <Session GenerationDate="{format-dateTime(current-dateTime(),'[Y0001][M01][D01]T[H01]:[m01]:[s01]')}" 
            SessionNr=""
            InterfaceRelease="3.0.0"
            SessionId="">
          </Session>
          <xsl:apply-templates/>
          </Root>
      </xsl:template>

      <xsl:template match="ORDER_DATA">
        <DocumentHeader 
            DocumentNo="{TB_ID}" 
            ExternalRecordId="{TB_ID}" 
            ExternalWebshopId="{CHANNEL_SIGN}" 
            ExternalOrderNo="{TB_ID}" 
            PricesIncludingVat="1" 
            SequenceNumber="22221" 
            ExternalChannelIdentifier="4821476634">

            <CustomerData>
                <xsl:apply-templates select="SELL_TO"/>
            </CustomerData>
        </DocumentHeader> 
      </xsl:template>

      <xsl:template match="SELL_TO">
        <SellToData SellToSalutationCode="" 
            SellToFirstName="{FIRSTNAME}"
            SellToMiddleName="*"
            SellToSureName="{LASTNAME}" 
            SellToStreet="{STREET_NO}" 
            SellToPostCode="{ZIP}" 
            SellToHouseNo="" 
            SellToHouseNoAddition="" 
            SellToCity="{CITY}" 
            SellToCountry="{COUNTRY}" 
            SellToPhoneNo="{PHONE_PRIVATE}" 
            SellToEmail="{EMAIL}"> 
        </SellToData>
        </xsl:template>
    </xsl:stylesheet>

Я ожидаю, что элемент SELL_TO будет отображаться между тегами CustomData, но в выходном файле (см. Результат ниже) информация SELL_TO будетотображается после тега CustomData даже после тега Documentheader.

        <?xml version="1.0" encoding="UTF-8"?>
    <Root xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xmlns="http://www.aca.nl/schema/weborder">
       <Session GenerationDate="20190927T11:29:01"
                SessionNr=""
                InterfaceRelease="3.0.0"
                SessionId=""
                />
       <DocumentHeader xmlns=""
                       DocumentNo="6130"                 
                       ExternalRecordId="6130"
                       ExternalWebshopId="amde"
                       ExternalOrderNo="6130"                
                       PricesIncludingVat="1"
                       SequenceNumber="22221"
                       ExternalChannelIdentifier="4821476634">
          <CustomerData/>
       </DocumentHeader>

       <SellToData xmlns=""
                   SellToSalutationCode=""
                   SellToFirstName="Max"
                   SellToMiddleName="*"
                   SellToSureName="Mustermann"
                   SellToStreet="Bahnhofsplatz 8"
                   SellToPostCode="66882"
                   SellToHouseNo=""
                   SellToHouseNoAddition=""
                   SellToCity="Ansbach"
                   SellToCountry="DE"
                   SellToPhoneNo="049123456789"
                   SellToEmail="max.mustermann@bahnhof.de"/>
    </Root>

Может кто-нибудь сказать, что не так с моим кодом XSLT?

Обновление:

Входной XML (Часть)

        <?xml version="1.0" encoding="UTF-8"?>
    <ORDER_LIST>
        <ORDER xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <ORDER_DATA>
                <ORDER_DATE>2019-09-10</ORDER_DATE>
                <TB_ID>6130</TB_ID>
                <CHANNEL_SIGN>amde</CHANNEL_SIGN>
                <CHANNEL_ID>302-1961532-0413146</CHANNEL_ID>
                <CHANNEL_NO>302-1961532-0413146</CHANNEL_NO>
                <PAID>0</PAID>
                <APPROVED>1</APPROVED>
                <ITEM_COUNT>1</ITEM_COUNT>
                <TOTAL_ITEM_AMOUNT>27.50</TOTAL_ITEM_AMOUNT>
                <DATE_CREATED>2019-09-10T17:36:19</DATE_CREATED>
            </ORDER_DATA>
            <SELL_TO>
                <TB_ID>6744</TB_ID>
                <FIRSTNAME>Max</FIRSTNAME>
                <LASTNAME>Mustermann</LASTNAME>
                <NAME>Max Mustermann</NAME>
                <STREET_NO>Bahnhofsplatz 8</STREET_NO>
                <ZIP>66882</ZIP>
                <CITY>Ansbach</CITY>
                <COUNTRY>DE</COUNTRY>
                <PHONE_PRIVATE>049123456789</PHONE_PRIVATE>
                <PHONE_OFFICE>049 123456789</PHONE_OFFICE>
                <PHONE_MOBILE>+49 123456789</PHONE_MOBILE>
                <EMAIL>max.mustermann@bahnhof.de</EMAIL>
            </SELL_TO>
        </ORDER>
    </ORDER_LIST>

1 Ответ

1 голос
/ 27 сентября 2019

Чтобы переместить (обработанные результаты) SELL_TO в элемент CustomerData, вы должны сделать две вещи:

  1. Укажите правильную инструкцию xsl:apply-templatesпуть к узлу - т.е. измените:

    <CustomerData>
        <xsl:apply-templates select="SELL_TO"/>
    </CustomerData>
    

    на:

    <CustomerData>
        <xsl:apply-templates select="../SELL_TO"/>
    </CustomerData>
    
  2. Удалите элемент SELL_TO из порядка обработки по умолчанию, добавив следующий шаблон:

    <xsl:template match="ORDER">
        <xsl:apply-templates select="ORDER_DATA"/>
    </xsl:template>
    

    В противном случае он будет обработан дважды.

    В качестве альтернативы измените инструкцию:

    <xsl:apply-templates/>
    

    в вашем основном шаблоне на:

    <xsl:apply-templates select="ORDER_LIST/ORDER/ORDER_DATA"/>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...