XSLT转换需要添加SOAP信封并在SOAP标头和正文之间拆分XML

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSLT转换需要添加SOAP信封并在SOAP标头和正文之间拆分XML相关的知识,希望对你有一定的参考价值。

我已尝试在各种博客中提出了几个选项,但想知道以下转换是否可行。

我需要转换以下XML,

<?xml version="1.0" encoding="UTF-8"?>
<ns1:ReturnLicensesForHost xmlns:ns1="http://example.com">
  <ns1:userName>ABCDEFGH</ns1:userName>
  <ns1:password>1234567</ns1:password>
  <ns1:hostIdType>XYZ</ns1:hostIdType>
  <ns1:hostId>987654</ns1:hostId>
  <ns1:product>STUV</ns1:product>
</ns1:ReturnLicensesForHost>

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:fs="http://example.com">
   <soap:Header>
      <fs:Credentials>
         <fs:userName>ABCDEFGH</fs:userName>
         <fs:password>1234567</fs:password>
      </fs:Credentials>
   </soap:Header>
   <soap:Body>
      <fs:ReturnLicensesForHost>
         <fs:hostIdType>XYZ</fs:hostIdType>
         <fs:hostId>987654</fs:hostId>
         <fs:product>STUV</fs:product>
      </fs:ReturnLicensesForHost>
   </soap:Body>
</soap:Envelope>

所以基本上,我需要添加一个SOAP信封并在Header和Body之间拆分字段。 请求您使用XSLT进行此转换。

答案

转换只需将结果XML放在模板中,并用引用输入XML的xsl:value-of短语替换所需的值(包括命名空间管理):

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

  <xsl:template match="/ns1:ReturnLicensesForHost">
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:fs="http://example.com">
        <soap:Header>
            <fs:Credentials>
                <fs:userName><xsl:value-of select="ns1:userName" /></fs:userName>
                <fs:password><xsl:value-of select="ns1:password" /></fs:password>
            </fs:Credentials>
        </soap:Header>
        <soap:Body>
            <fs:ReturnLicensesForHost>
                <fs:hostIdType><xsl:value-of select="ns1:hostIdType" /></fs:hostIdType>
                <fs:hostId><xsl:value-of select="ns1:hostId" /></fs:hostId>
                <fs:product><xsl:value-of select="ns1:product" /></fs:product>
            </fs:ReturnLicensesForHost>
        </soap:Body>
    </soap:Envelope>   
  </xsl:template>

</xsl:stylesheet>

输出:

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:fs="http://example.com" xmlns:ns1="http://example.com">
    <soap:Header>
        <fs:Credentials>
            <fs:userName>ABCDEFGH</fs:userName>
            <fs:password>1234567</fs:password>
        </fs:Credentials>
    </soap:Header>
    <soap:Body>
        <fs:ReturnLicensesForHost>
            <fs:hostIdType>XYZ</fs:hostIdType>
            <fs:hostId>987654</fs:hostId>
            <fs:product>STUV</fs:product>
        </fs:ReturnLicensesForHost>
    </soap:Body>
</soap:Envelope>

以上是关于XSLT转换需要添加SOAP信封并在SOAP标头和正文之间拆分XML的主要内容,如果未能解决你的问题,请参考以下文章

如果标记不存在,则使用XSLT将XML标记添加到SOAP消息

使用 XSLT 从 XML 中删除 xmlns

使用soap4r时出现问题,无法将命名空间、编码样式添加到soap信封

使用没有 Soap Envelope 的 XSD 验证 XML 数据

从头开始使用 WS-Addressing 和 WS-Security 创建 SOAP 标头

在PHP中使用文字xml的SOAP