
Есть несколько способов добиться этого в 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 . |