如何使用wso2 ei更新soap响应命名空间值

如何使用wso2 ei更新soap响应命名空间值,soap,wso2,wso2esb,wso2ei,Soap,Wso2,Wso2esb,Wso2ei,我有一个代理服务来公开wso2 ei上的soap api,我需要用我的代理服务更新soap响应的名称空间值,并返回另一个名称空间值。 我已经试过在outsequence中使用enrich mediator,如下所示 <property name="namespace" scope="default" type="STRING" value="http://tempuri-updated.org/"/&

我有一个代理服务来公开wso2 ei上的soap api,我需要用我的代理服务更新soap响应的名称空间值,并返回另一个名称空间值。 我已经试过在outsequence中使用enrich mediator,如下所示

<property name="namespace"
               scope="default"
               type="STRING"
               value="http://tempuri-updated.org/"/>
      <enrich>
        <source clone="false" property="namespace" type="property"/>
        <target xmlns:ser="http://services.samples"
                xmlns:ns="http://org.apache.synapse/xsd"
                xpath="namespace-uri($body/*)/text()"/>
     </enrich>

我得到这个错误

错误-要充实的EnrichMediator目标对象无效

我的实际soap响应如下

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <AddResponse xmlns="http://tempuri.org/">
         <AddResult>12</AddResult>
      </AddResponse>
   </soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <AddResponse xmlns="http://tempuri-updated.org/">
         <AddResult>12</AddResult>
      </AddResponse>
   </soap:Body>
</soap:Envelope>

12
我的预期产出如下

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <AddResponse xmlns="http://tempuri.org/">
         <AddResult>12</AddResult>
      </AddResponse>
   </soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <AddResponse xmlns="http://tempuri-updated.org/">
         <AddResult>12</AddResult>
      </AddResponse>
   </soap:Body>
</soap:Envelope>

12
欢迎您的反馈

试试这个


(...)
(...)
试试这个


(...)
(...)

这不能用enrich mediator完成。因为在与Rich mediator目标处理相关的代码中,xpath表达式的解析结果应该是SOAPHeaderImpl、OMElement、OMText或OMAttribute中的一个。由于namespace-uri()仅返回字符串值,因此要充实的目标将变得无效。作为此用例的替代方案,我们可以使用XSLT中介进行XSLT转换。下面是我尝试过的XSL样式表示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@* | comment() | processing-instruction()">
    <xsl:copy/>
    </xsl:template>

   <xsl:template match="*">
       <xsl:element name="{local-name()}"
             namespace="http://tempuri-updated.org/">
       <xsl:apply-templates select="@* | node()"/>
       </xsl:element>
    </xsl:template>


在从EI发送响应之前,我们可以在XSLT中介中引用此样式表。新名称空间将被添加到正文中。

这不能通过Rich mediator完成。因为在与Rich mediator目标处理相关的代码中,xpath表达式的解析结果应该是SOAPHeaderImpl、OMElement、OMText或OMAttribute中的一个。由于namespace-uri()仅返回字符串值,因此要充实的目标将变得无效。作为此用例的替代方案,我们可以使用XSLT中介进行XSLT转换。下面是我尝试过的XSL样式表示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@* | comment() | processing-instruction()">
    <xsl:copy/>
    </xsl:template>

   <xsl:template match="*">
       <xsl:element name="{local-name()}"
             namespace="http://tempuri-updated.org/">
       <xsl:apply-templates select="@* | node()"/>
       </xsl:element>
    </xsl:template>


在从EI发送响应之前,我们可以在XSLT中介中引用此样式表。新名称空间将添加到正文。

这将更改信封名称空间,并保留正文。但是,需要更改的名称空间在主体中。是的,这不是确切的答案。您可以对其进行修改以完成所需操作。这将更改信封名称空间,并保留正文。但是,需要更改的名称空间在主体中。是的,这不是确切的答案。你可以修改它来完成你想做的事情。它工作得很好,非常感谢@Thishani Lucasis它工作得很好,非常感谢@Thishani Lucas