Посредник WSO2 XSLT не разрешает xpath

Надеюсь, кто-то сможет указать на ослепляюще очевидное для меня - я хочу выполнить несколько простых переводов полезной нагрузки мыла перед отправкой в ​​серверную службу - что очень важно, мне нужен доступ ко всем заголовкам мыла, доставленным в исходной полезной нагрузке. Мое наивное (?) Мышление заключалось в том, чтобы просто установить для атрибута источника для посредника <xslt> значение «/», поскольку я знаю, что по умолчанию он будет начинаться с первого дочернего элемента <body>, и мне действительно нужен доступ к заголовкам. WSO2 возвращает ошибку «Оценка выражения XPath / не привела к ошибке OMNode».

Есть ли одна или несколько причуд взаимодействия WSO2 / xpath, которые я пропустил в литературе? Любые указатели с благодарностью получены, спасибо


person lone_wolf    schedule 07.01.2016    source источник


Ответы (2)


Как упомянул Тишан, вы можете использовать переменную 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
comment
В какой-то степени решает проблему, в моем случае мне нужно передать больше, чем просто значение, есть список. Я предпочитаю передавать полный XML в качестве параметра, но это не поддерживается :( - person Sripathi Acharya; 14.04.2016

Вы можете получить доступ к заголовкам SOAP, используя заголовок Synapse Xpath Variable $ в исходном xpath. (Пример: $ header / wsa: Кому).
Надеюсь, это поможет !!

person Tishan    schedule 08.01.2016