希望有人可以指出对我来说非常明显 - 我想在发送到后端服务之前对soap有效负载执行一些简单的翻译 - 至关重要的是,我需要访问原始有效负载中提供的所有soap-header 。
我天真(?)的想法是简单地将<xslt>
调解员的源属性设置为&#34; /&#34;因为默认情况下我会知道它将从<body>
的第一个孩子开始,我真的需要访问标题。
WSO2返回&#34; XPath表达式的评估/不会导致OMNode&#34;错误。
文献中是否遗漏了一个或多个WSO2 / xpath交互操作怪癖?任何指针都感激地收到了,谢谢
答案 0 :(得分:1)
正如Tishan所提到的,您可以使用$header
synapse xpath变量来访问消息上下文中的soap标头。但是当谈到xslt mediator时,它有点棘手。您无法直接访问xslt样式表中的消息上下文值。但是可以将这些值作为参数传递并用于转换。让我们看看我们如何实现这一目标。
以下是account.xslt文件的外观。请注意,有两个名为PARAM_SSN
和PARAM_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
接下来是使用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)。
希望这有帮助!!