Статьи

Фильтрация содержимого сообщения с помощью WSO2 ESB

ContentFilter Каждый архитектор или разработчик интеграции должен быть знаком с Enterprise Integration Patterns (EIP), как описано Грегором Хопе и Бобби Вулфом. Одним из шаблонов является «Фильтр сообщений содержимого» (его не следует путать с шаблоном фильтра сообщений ).
Есть несколько способов добиться этого в WSO2 с другим посредником . Одним из способов является использование посредника XSLT, где вы можете просто использовать XSLT для выполнения фильтрации. Другой (не очень очевидный, исходя из названия) — это Enrich Mediator .

Вот пример того, как использовать для этого Медиатор Enrich. Представьте себе оригинальное сообщение:

01
02
03
04
05
06
07
08
09
10
11
12
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tmp="http://www.pascalalma.net/order">
  <soapenv:Header/>
  <soapenv:Body>
    <tmp:message>
      <tmp:document>
        <tmp:order>
          <tmp:id>123</tmp:id>
        </tmp:order>
      </tmp:document>
    </tmp:message>
  </soapenv:Body>
</soapenv:Envelope>

На самом деле мы хотим получить сообщение Soap, в котором в качестве полезной нагрузки используется только элемент order. Мы можем сделать это с помощью посредника Enrich со следующей конфигурацией:

1
2
3
4
<enrich xmlns:tmp="http://www.pascalalma.net/order">
  <source clone="false" type="custom" xpath="//tmp:document/*" />
  <target action="replace" type="body" />
</enrich>

Таким образом, в этой конфигурации мы говорим посреднику, что он должен взять содержимое элемента document в качестве источника и поместить это содержимое в тело входящего сообщения SOAP.

Когда вы решите использовать посредник XSLT, вместо этого приведен пример XSLT, который можно использовать для удаления определенных элементов из документа XML. Вы можете использовать его в следующем сообщении XML:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tmp="http://www.pascalalma.net/order">
  <soapenv:Header/>
  <soapenv:Body>
    <tmp:message>
      <tmp:document>
        <tmp:order>
          <tmp:id>123</tmp:id>
          <tmp:type>backorder</tmp:type>
          <tmp:status>open</tmp:status>
          <tmp:description>open</tmp:description>
        </tmp:order>
      </tmp:document>
    </tmp:message>
  </soapenv:Body>
</soapenv:Envelope>

Если нам нужен тот же XML-документ, но без элементов «tmp: type» и «tmp: description», мы можем определить XSLT-медиатор следующим образом:

1
2
3
<xslt key="xslt/remove-elements-v1.xslt" description="remove unwanted elements">
  <property name="removeElementsNamed" value="type,description" />
</xslt>

Код XSLT, который делает эту работу (я нашел его на сайте stackoverflow ):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="no" indent="yes" encoding="UTF-8"/>
    <xsl:strip-space elements="*"/>
 
    <xsl:param name="removeElementsNamed" />
 
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
 
    <xsl:template match="*[local-name()=tokenize($removeElementsNamed,'[\|, \t]')]"/>
</xsl:stylesheet>

Обратите внимание, что этот XSLT не учитывает пространства имен и просто удаляет все элементы, локальное имя которых соответствует указанным именам!