xslt с несколькими шаблонами - PullRequest
0 голосов
/ 25 октября 2018

Как применить несколько шаблонов в xslt?Первая часть xslt используется для удаления пространств имен и префиксов.Вторая часть используется для преобразования атрибута (смещение) в новый элемент.

Пример ввода XML

<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
  <ns3:getResponse xmlns="https://dataservices.ipt.com/scheduleRequest" xmlns:ns2="https://dataservices.ipt.com/ScheduleResult" xmlns:ns3="https://dataservices.ipt.com/Schedules" xmlns:ns4="https://dataservices.ipt.com/xsd/inf">
     <ns2:ScheduleResult as-of-date="2018-010-11T14:09:46.083Z">
        <ns2:Schedules>
           <ns2:ScheduleKeys>
              <ns2:ScheduleID>ABCD</ns2:ScheduleID>
              <ns2:SourceSystemName Offset="GMT6">Cloud_1</ns2:SourceSystemName>
           </ns2:ScheduleKeys>
        </ns2:Schedules>
     </ns2:ScheduleResult>
  </ns3:getResponse>
 </S:Body>
</S:Envelope>

Требуемый вывод

<?xml version="1.0" encoding="utf-8"?>
<Envelope>
   <Body>
      <getResponse>
         <ScheduleResult as-of-date="2018-010-11T14:09:46.083Z">
            <Schedules>
               <ScheduleKeys>
                  <ScheduleID>ABCD</ScheduleID>
                  <SourceSystemName>
                    <SystemName>Cloud_1</SystemName>
                    <Offset>GMT6</Offset>
                  </SourceSystemName>
               </ScheduleKeys>
            </Schedules>
         </ScheduleResult>
      </getResponse>
   </Body>
</Envelope>

попытка XSLT

Обратите внимание, что при запуске первой части xslt пространства имен и префиксы удаляются по желанию.Также, когда вторая часть XSLT запускается сама по себе, Атрибут для нового элемента обрабатывается правильно.Однако при объединении двух частей XSLT (как показано здесь) работает только вторая часть.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

    <!-- Remove all namespaces and prefixes -->
    <xsl:template match="*">
        <xsl:element name="{local-name(.)}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name(.)}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <!-- Convert any elements with Offset                             -->
    <!-- From                                                         -->
    <!-- <SourceSystemName Offset="GMT6">Cloud_1</SourceSystemName>   -->
    <!-- To                                                           -->
    <!-- <SourceSystemName>                                           -->
    <!--     <SystemName>Cloud_1</SystemName>                         -->
    <!--     <Offset>GNT6</WeightUOM>                                 -->
    <!-- </SourceSystemName                                           -->

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

    <xsl:template match="*[@Offset]/text()" />

    <xsl:template match="@Offset">
        <SystemName>
            <xsl:value-of select="../text()"/>
        </SystemName>
        <xsl:element name="{name()}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Сгенерированный вывод из XSLT

К сожалению, тольковторая половина XSLT работает.

<?xml version="1.0" encoding="utf-8"?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
   <S:Body>
      <ns3:getResponse xmlns:ns3="https://dataservices.ipt.com/Schedules" xmlns="https://dataservices.ipt.com/scheduleRequest" xmlns:ns2="https://dataservices.ipt.com/ScheduleResult" xmlns:ns4="https://dataservices.ipt.com/xsd/inf">
         <ns2:ScheduleResult as-of-date="2018-010-11T14:09:46.083Z">
            <ns2:Schedules>
               <ns2:ScheduleKeys>
                  <ns2:ScheduleID>ABCD</ns2:ScheduleID>
                  <ns2:SourceSystemName>
                      <SystemName xmlns="">Cloud_1</SystemName>
                      <Offset xmlns="">GMT6</Offset>
                  </ns2:SourceSystemName>
               </ns2:ScheduleKeys>
            </ns2:Schedules>
         </ns2:ScheduleResult>
      </ns3:getResponse>
   </S:Body>
</S:Envelope>

1 Ответ

0 голосов
/ 25 октября 2018

Удалите шаблон

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

, тогда остальные должны сделать (https://xsltfiddle.liberty -development.net / nc4NzRc ), если у вас нет каких-либо инструкций по обработке или комментариев, которые вы также хотитескопируйте, для тех, кого вы можете добавить шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...