XSL-преобразование для добавления пространства имен и заголовка (описан ввод и вывод) - PullRequest
0 голосов
/ 05 марта 2019

Преобразование новичка в XSL, для получения справки по преобразованию данных с использованием xsl.

Входные данные указаны ниже:

<?xml version="1.0" encoding="UTF-8"?>
 <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Body>
   <abcRequest xmlns="http://google.com/2018/abcService">
     <messageHeader>
        <Id>000000</Id>
        <aId>572b0285-7e06-4834-90c0-dc45eeeafe70</aId>
        <version>1.0</version>
     </messageHeader>
   </abcRequest>
  </soap:Body>
</soap:Envelope>

Ожидаемые выходные данные приведены ниже:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:p="http://www.bnppf.com/20190101/TA/TA99eWLNotificationDataSrv">
  <soap:Header>
    <wsa:Action xmlns:wsa="http://www.w3.org/2005/08/addressing">http://www.gmail.com/20190101/newService</wsa:Action>
  </soap:Header>
  <soap:Body>
    <p:abcRequest xmlns="http://google.com/2018/abcService">
     <p:messageHeader>
        <p:Id>000000</p:Id>
        <p:aId>572b0285-7e06-4834-90c0-dc45eeeafe70</p:aId>
        <p:version>1.0</p:version>
     </p:messageHeader>
    </p:abcRequest>
  </soap:Body>
</soap:Envelope>

1 Ответ

0 голосов
/ 05 марта 2019

Преобразование можно выполнить с помощью следующей таблицы стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:abc="http://google.com/2018/abcService" xmlns:p="http://www.bnppf.com/20190101/TA/TA99eWLNotificationDataSrv">
  <xsl:output method="xml"/>

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

  <xsl:template match="soap:Envelope">
    <soap:Envelope>
        <soap:Header>
          <wsa:Action xmlns:wsa="http://www.w3.org/2005/08/addressing">http://www.gmail.com/20190101/newService</wsa:Action>
        </soap:Header>
        <xsl:apply-templates select="soap:Body" />
    </soap:Envelope>
  </xsl:template>

  <xsl:template match="abc:*">
      <xsl:element name="p:{local-name()}">
          <xsl:apply-templates select="node()|@*" />
      </xsl:element>
  </xsl:template> 

</xsl:stylesheet>

Но следующее пространство имен по умолчанию xmlns для вашего элемента p:abcRequest не будет создано, поскольку оно излишне.

<p:abcRequest xmlns="http://google.com/2018/abcService">

Вместо этого для этого элемента и его дочерних элементов будет установлено пространство имен xmlns:p.
Выход:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:abc="http://google.com/2018/abcService" xmlns:p="http://www.bnppf.com/20190101/TA/TA99eWLNotificationDataSrv">
    <soap:Header>
        <wsa:Action xmlns:wsa="http://www.w3.org/2005/08/addressing">http://www.gmail.com/20190101/newService</wsa:Action>
    </soap:Header>
    <soap:Body>
        <p:abcRequest>
            <p:messageHeader>
                <p:Id>000000</p:Id>
                <p:aId>572b0285-7e06-4834-90c0-dc45eeeafe70</p:aId>
                <p:version>1.0</p:version>
            </p:messageHeader>
        </p:abcRequest>
    </soap:Body>
</soap:Envelope>
...