Как упомянул Тишан, вы можете использовать переменную xpath $header
synapse для доступа к заголовкам мыла в контексте сообщения. Но с 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>
Вышеупомянутый файл сохранен в реестре WSO2 ESB под /_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, путем доступа к контексту сообщения. Значение для 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>
Надеюсь, это решит вашу проблему.
Ваше здоровье!
person
Indika Sampath
schedule
09.01.2016