Преобразование ниже XML с использованием XSLT - PullRequest
0 голосов
/ 15 марта 2020

Не могли бы вы помочь мне с кодом XSLT для преобразования ниже XML -

Ввод XML:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:PrintCertificateByContractNumber xmlns:ns0="http://tempuri.org/">
   <ns0:ContractNumber>300001111</ns0:ContractNumber>
   <ns0:Credentials>
      <ns1:Password xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common">uuuuuuuuuuuuuu</ns1:Password>
      <ns1:ResponseStatusList xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common">
         <ns2:ResponseStatus xmlns:ns2="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities">
            <ns2:ErrorMessage/>
            <ns2:ResponseType>Error</ns2:ResponseType>
         </ns2:ResponseStatus>
      </ns1:ResponseStatusList>
      <ns1:UserName xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common">xxxxxxxxxxxxxxxx</ns1:UserName>
      <ns1:UserReferenceNumber xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common"/>
   </ns0:Credentials>
</ns0:PrintCertificateByContractNumber>

Вывод XML, что необходимо:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities">
  <soap:Header/>
  <soap:Body>
    <tem:PrintCertificateByContractNumber>
      <tem:ContractNumber>?</tem:ContractNumber>
      <tem:Credentials>
        <ep4:Password>uuuuuuuu</ep4:Password>
        <ep4:ResponseStatusList>
          <ep41:ResponseStatus>
            <ep41:ErrorMessage></ep41:ErrorMessage>
            <ep41:ResponseType>Error</ep41:ResponseType>
          </ep41:ResponseStatus>
        </ep4:ResponseStatusList>
        <ep4:UserName>xxxxxxxx</ep4:UserName>
        <ep4:UserReferenceNumber></ep4:UserReferenceNumber>
      </tem:Credentials>
    </tem:PrintCertificateByContractNumber>
  </soap:Body>
</soap:Envelope>

XSLT-код, который я использую:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" exclude-result-prefixes="ns0 ns1 ns2" xmlns:ns2="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:ns0="http://tempuri.org/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output version="1.0" encoding="UTF-8" method="xml"/>
   <xsl:template match="/">
      <soapenv:Envelope xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:tem="http://tempuri.org/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
         <soapenv:Header/>
         <soapenv:Body>
            <tem:PrintCertificateByContractNumber>
               <tem:ContractNumber>
                  <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:ContractNumber"/>
               </tem:ContractNumber>
               <tem:Credentials>
                  <ep4:Password>
                     <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:Password"/>
                  </ep4:Password>
                  <ep4:ResponseStatusList>
                     <ep41:ResponseStatus>
                        <ep41:ErrorMessage>
                           <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:ResponseStatusList/ns2:ResponseStatus/ns2:ErrorMessage"/>
                        </ep41:ErrorMessage>
                        <ep41:ResponseType>
                           <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:ResponseStatusList/ns2:ResponseStatus/ns2:ResponseType"/>
                        </ep41:ResponseType>
                     </ep41:ResponseStatus>
                  </ep4:ResponseStatusList>
                  <ep4:UserName>
                     <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:UserName"/>
                  </ep4:UserName>
                  <ep4:UserReferenceNumber>
                     <xsl:value-of select="ns0:PrintCertificateByContractNumber/ns0:Credentials/ns1:UserReferenceNumber"/>
                  </ep4:UserReferenceNumber>
               </tem:Credentials>
            </tem:PrintCertificateByContractNumber>
         </soapenv:Body>
      </soapenv:Envelope>
   </xsl:template>
</xsl:stylesheet>

Вывод получаю:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header/>
  <soapenv:Body>
    <tem:PrintCertificateByContractNumber xmlns:tem="http://tempuri.org/">
      <tem:ContractNumber/>
      <tem:Credentials>
        <ep4:Password xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" />
        <ep4:ResponseStatusList xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common">
          <ep41:ResponseStatus xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities">
            <ep41:ErrorMessage/>
            <ep41:ResponseType/>
          </ep41:ResponseStatus>
        </ep4:ResponseStatusList>
        <ep4:UserName xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" />
        <ep4:UserReferenceNumber xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" />
      </tem:Credentials>
    </tem:PrintCertificateByContractNumber>
  </soapenv:Body>
</soapenv:Envelope>

Невозможно удалить пространства имен из "Password" et c. из сопоставления, которое я использую. Не могли бы вы дать мне знать, как удалить пространства имен из окончательного результата удалите XLST, не копируя данные для каждого узла.

1 Ответ

0 голосов
/ 15 марта 2020

AFAICT, вывод, который вы получаете, семантически идентичен выводу, который вы хотите. Размещение объявлений пространства имен совершенно несущественно, и у вас очень мало контроля над ним, по крайней мере, в XSLT 1.0.

Это не должно иметь значения для принимающей заявки - и если это так, проблема должна быть там исправлена. Вы можете попытаться принудительно добавить объявления пространства имен к элементу root, сделав заголовок:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://tempuri.org/" 
xmlns:ns1="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" 
xmlns:ns2="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tem="http://tempuri.org/"
xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" 
xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" 
exclude-result-prefixes="ns0 ns1 ns2" >

, а затем изменив:

<soapenv:Envelope xmlns:ep41="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities" xmlns:ep4="http://schemas.datacontract.org/2004/07/EP4.Integration.Entities.Common" xmlns:tem="http://tempuri.org/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

на:

<soapenv:Envelope>
    <xsl:copy-of select="document('')/xsl:stylesheet/namespace::tem | document('')/xsl:stylesheet/namespace::ep4 | document('')/xsl:stylesheet/namespace::ep41"/>

Это может или не может работать, в зависимости от вашего процессора XSLT.

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