WSO2 XSLT介体无法解析xpath

时间:2016-01-07 23:08:02

标签: xslt wso2 mediator

希望有人可以指出对我来说非常明显 - 我想在发送到后端服务之前对soap有效负载执行一些简单的翻译 - 至关重要的是,我需要访问原始有效负载中提供的所有soap-header 。 我天真(?)的想法是简单地将<xslt>调解员的源属性设置为&#34; /&#34;因为默认情况下我会知道它将从<body>的第一个孩子开始,我真的需要访问标题。 WSO2返回&#34; XPath表达式的评估/不会导致OMNode&#34;错误。

文献中是否遗漏了一个或多个WSO2 / xpath交互操作怪癖?任何指针都感激地收到了,谢谢

2 个答案:

答案 0 :(得分:1)

正如Tishan所提到的,您可以使用$header synapse xpath变量来访问消息上下文中的soap标头。但是当谈到xslt mediator时,它有点棘手。您无法直接访问xslt样式表中的消息上下文值。但是可以将这些值作为参数传递并用于转换。让我们看看我们如何实现这一目标。

以下是account.xslt文件的外观。请注意,有两个名为PARAM_SSNPARAM_ACCT_NO的参数用于为<ssn></ssn><accountNumber></accountNumber>分配值

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="PARAM_SSN"></xsl:param>
    <xsl:param name="PARAM_ACCT_NO"></xsl:param>
    <xsl:template match="/">
        <account xmlns="http://services.samples">
            <ssn>
                <xsl:value-of select="$PARAM_SSN"></xsl:value-of>
            </ssn>
            <accountNumber>
                <xsl:value-of select="$PARAM_ACCT_NO"></xsl:value-of>
            </accountNumber>
            <accountHolder>
                <xsl:value-of select="//name"></xsl:value-of>
            </accountHolder>
        </account>
    </xsl:template>
</xsl:stylesheet>

上面的文件保存在/_system/governance/transform/account.xslt

下的WSO2 ESB的注册表中

接下来是使用account.xslt进行转换的示例代理

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TransformExample"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <xslt key="gov:/transform/account.xslt">
            <property name="PARAM_SSN" expression="$header/seccode"/>
            <property name="PARAM_ACCT_NO" expression="$trp:acctNo"/>
         </xslt>
         <log level="custom">
            <property name="Transformed Payload" expression="$body"/>
         </log>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
   </target>
   <description/>
</proxy>

在这里你可以看到在<xslt>中间内部,我通过访问消息上下文传递xslt中定义的两个参数的值。来自soap标头的PARAM_SSN的值和从传输标头中获取的PARAM_ACCT_NO的值。这个代理服务由soapUI调用,具有以下有效负载。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
    <seccode>987654321</seccode>
   </soapenv:Header>
   <soapenv:Body>
    <request>
        <name>Indika Sampath</name>
    </request>
   </soapenv:Body>
</soapenv:Envelope>

此外,我发送acctNo作为传输标头以及请求。一旦命中代理,您可以在控制台中看到转换后的输出日志,如下所示。

[2016-01-09 07:19:02,146]  INFO - LogMediator Transformed Payload = <soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <account xmlns="http://services.samples"><ssn>987654321</ssn><accountNumber>123456789</accountNumber><accountHolder>Indika Sampath</accountHolder></account>
   </soapenv:Body>

希望这可以解决您的问题。

干杯!

答案 1 :(得分:0)

您可以使用源xpath中的Synapse Xpath Variable $标头访问SOAP标头(例如:$ header / wsa:To)。
希望这有帮助!!