使用XSLT更改SOAP信封的一部分

时间:2014-04-21 10:45:56

标签: xml xslt xslt-1.0 soapui xml-namespaces

我想知道是否可以使用XSLT更改部分SOAP信封。我仅修改其中一部分的原因是因为其余部分是动态响应。

我有以下XML消息:

<SOAP-ENV:Body>
      <xyz:TheResponse Status="S" xmlns:xyz="namespace">
         <Hdr>
            <Sndr>
               ...
            </Sndr>
         </Hdr>
         <Command>
            ...
         </Command>
         <Data>
            ...
         </Data>
      </xyz:TheResponse>
   </SOAP-ENV:Body>

我在XSLT下面使用:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="namespace">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/SOAP-ENV:Body">
    <abc:SomeServiceResp xmlns:abc="SomePackage.SOAP.SomeService">
    <xsl:copy-of select="*"/>
    </abc:SomeServiceResp>
    </xsl:template>
</xsl:stylesheet>

XSLT的结果如下:

<SOAP-ENV:Body>
    <abc:SomeServiceResp xmlns:abc="SomePackage.SOAP.SomeService" xmlns:tns="namespace">
              <xyz:TheResponse Status="S" xmlns:xyz="namespace">
                 <Hdr>
                    <Sndr>
                       ...
                    </Sndr>
                 </Hdr>
                 <Command>
                    ...
                 </Command>
                 <Data>
                    ...
                 </Data>
              </xyz:TheResponse>
    </abc:SomeServiceResp>
</SOAP-ENV:Body>

我得到了预期的结果,它在我的回复中添加了这一行 <abc:SomeServiceResp xmlns:abc="SomePackage.SOAP.SomeService" xmlns:tns="namespace"

但是,我打算改变第二行:

<xyz:TheResponse Status="S" xmlns:xyz="namespace">

<tns:TheResponse Status="S" xmlns:tns="namespace">保留“状态”,因为它是动态响应。

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如何更改模板以匹配TheReoponse,然后像这样执行显式命名空间:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:tns="namespace1"
    xmlns:SOAP-ENV="SOAP"
    xmlns:xyz="namespace">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />


    <xsl:template match="/SOAP-ENV:Body">
      <xsl:copy>
        <abc:SomeServiceResp xmlns:abc="SomePackage.SOAP.SomeService">
          <xsl:apply-templates/>
        </abc:SomeServiceResp>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="xyz:TheResponse">

      <tns:TheResponse xmlns:tns="namespace">
        <xsl:attribute name="Status">
          <xsl:value-of select="@Status"/>
        </xsl:attribute>
        <xsl:copy-of select="*"/>
      </tns:TheResponse>

    </xsl:template>

    <xsl:template match="*">
      <xsl:copy>
        <xsl:apply-templates />
      </xsl:copy>
    </xsl:template>

</xsl:stylesheet>