Каждый архитектор или разработчик интеграции должен быть знаком с 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
|
< 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: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 не учитывает пространства имен и просто удаляет все элементы, локальное имя которых соответствует указанным именам!
Ссылка: | Фильтрация содержимого сообщения с помощью WSO2 ESB от нашего партнера JCG Паскаля Альмы в блоге Pragmatic Integrator . |