Как именно работает этот итерационный посредник в этом проекте ESB WSO2?
Я абсолютно новичок в WSO2, и у меня есть следующие сомнения относительно проекта ESB, над которым я работаю.
Я должен повторять каждый <Sample>...</Sample>
элемент следующего XML- документа (поступающего из службы DSS):
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<Samples xmlns="http://ws.wso2.org/dataservice">
<Sample>
<sample_id>XXX00001</sample_id>
<processed>n</processed><sample_doi>sampleid001</sample_doi><date>2000-01-01</date><hold_wiews>hold_wiews-0001</hold_wiews><hold_pid>hold_pid-001</hold_pid><hold_name>hold_name-001</hold_name><hold_address>hold_address-001</hold_address><hold_country>001</hold_country><hold_lat>hold_lat-1</hold_lat><hold_lon>hold_lon-1</hold_lon><method>acqu</method><genus>genus-001</genus><species>species-001</species><sp_auth>sp_auth-001</sp_auth><subtaxa>subtaxa-001</subtaxa><st_auth>st_auth-001</st_auth><bio_status>001</bio_status><mls_status>01</mls_status><prov_sid>prov_sid-001</prov_sid><provenance>pr1</provenance><coll_sid>coll_sid-001</coll_sid><coll_miss_id>coll_miss_id-001</coll_miss_id><coll_site>coll_site-001</coll_site><coll_lat>coll_lat-1</coll_lat><coll_lon>coll_lon-1</coll_lon><coll_uncert>coll_uncert-001</coll_uncert><coll_datum>coll_datum-001</coll_datum><coll_georef>coll_georef-001</coll_georef><coll_elevation>1</coll_elevation><coll_date>2001-01-01</coll_date><coll_source>s1</coll_source><ancestry>ancestry-001</ancestry>
</Sample>
<Sample>
<sample_id>XXX00002</sample_id>
<processed>n</processed><sample_doi>sampleid002</sample_doi><date>2000-01-02</date><hold_wiews>hold_wiews-0002</hold_wiews><hold_pid>hold_pid-002</hold_pid><hold_name>hold_name-002</hold_name><hold_address>hold_address-002</hold_address><hold_country>002</hold_country><hold_lat>hold_lat-2</hold_lat><hold_lon>hold_lon-2</hold_lon><method>acqu</method><genus>genus-002</genus><species>species-002</species><sp_auth>sp_auth-002</sp_auth><subtaxa>subtaxa-002</subtaxa><st_auth>st_auth-002</st_auth><bio_status>002</bio_status><mls_status>02</mls_status><prov_sid>prov_sid-002</prov_sid><provenance>pr2</provenance><coll_sid>coll_sid-002</coll_sid><coll_miss_id>coll_miss_id-002</coll_miss_id><coll_site>coll_site-002</coll_site><coll_lat>coll_lat-2</coll_lat><coll_lon>coll_lon-2</coll_lon><coll_uncert>coll_uncert-002</coll_uncert><coll_datum>coll_datum-002</coll_datum><coll_georef>coll_georef-002</coll_georef><coll_elevation>2</coll_elevation><coll_date>2001-01-02</coll_date><coll_source>s2</coll_source><ancestry>ancestry-002</ancestry>
</Sample>
<Sample>
<sample_id>XXX00003</sample_id>
<processed>n</processed><sample_doi>sampleid003</sample_doi><date>2000-01-03</date><hold_wiews>hold_wiews-0003</hold_wiews><hold_pid>hold_pid-003</hold_pid><hold_name>hold_name-003</hold_name><hold_address>hold_address-003</hold_address><hold_country>003</hold_country><hold_lat>hold_lat-3</hold_lat><hold_lon>hold_lon-3</hold_lon><method>acqu</method><genus>genus-003</genus><species>species-003</species><sp_auth>sp_auth-003</sp_auth><subtaxa>subtaxa-003</subtaxa><st_auth>st_auth-003</st_auth><bio_status>003</bio_status><mls_status>03</mls_status><prov_sid>prov_sid-003</prov_sid><provenance>pr3</provenance><coll_sid>coll_sid-003</coll_sid><coll_miss_id>coll_miss_id-003</coll_miss_id><coll_site>coll_site-003</coll_site><coll_lat>coll_lat-3</coll_lat><coll_lon>coll_lon-3</coll_lon><coll_uncert>coll_uncert-003</coll_uncert><coll_datum>coll_datum-003</coll_datum><coll_georef>coll_georef-003</coll_georef><coll_elevation>3</coll_elevation><coll_date>2001-01-03</coll_date><coll_source>s3</coll_source><ancestry>ancestry-003</ancestry>
</Sample>
</Samples>
</soapenv:Body>
</soapenv:Envelope>
Для этого я использую посредник итерации (он работает довольно хорошо), что-то вроде этого:
<iterate expression="$body//ds:Sample" id="ITR_AGG" xmlns:ds="http://ws.wso2.org/dataservice">
<target>
<sequence>
<enrich>
<source clone="true" type="envelope"/>
<target property="sampleData" type="property"/>
</enrich>
<!-- Log Sample Data -->
<log level="custom">
<property expression="$ctx:sampleData" name="sample data"/>
</log>
...........................................................
...........................................................
DO SOME OTHER STUFF
...........................................................
...........................................................
</sequence>
</target>
</iterate>
Это работает нормально, но у меня есть некоторые сомнения, я пытаюсь объяснить эти сомнения.
Посредник итерации реализует шаблон интеграции Splitter Enterprise **, он используется для разделения сообщения на ряд различных сообщений, полученных из родительского сообщения **.
Итак, я разделяю исходное сообщение, которое в основном содержится в <soapenv:Body>---</soapenv:Body>
контейнер в 3 <Sample>...</Sample>
отдельное сообщение
Это работает, но почему выражение итерации определено в посреднике итератора:
<iterate expression="$body//ds:Sample" id="ITR_AGG" xmlns:ds="http://ws.wso2.org/dataservice">
такое $body // ds: Sample?
Итак, я думаю, что я должен использовать префикс ds: потому что он исходит от службы данных (скажите мне, если я делаю неправильное утверждение). Но что именно представляет переменную $body? (это что-то вроде переменной?)
Это представляет <soapenv:Body>
элемент, в котором нужно искать <Sample>
элемент, который должен быть повторен? Или что? Если мое предположение верно, то как <soapenv:Body>
связан с переменной $body?
Второе сомнение связано с использованием посредника обогащения, содержащегося в начале повторного посредника:
<enrich>
<source clone="true" type="envelope"/>
<target property="sampleData" type="property"/>
</enrich>
Что именно делает? Мне кажется, что он копирует текущий элемент, который выполняет итерацию, в новое свойство с именем sampleData, после этого посредник записывает в журнал свойство sampleData, которое печатается примерно так:
sample data =
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<Sample xmlns="http://ws.wso2.org/dataservice">
<sample_id>XXX00001</sample_id>
<processed>n</processed><sample_doi>sampleid001</sample_doi><date>2000-01-01</date><hold_wiews>hold_wiews-0001</hold_wiews><hold_pid>hold_pid-001</hold_pid><hold_name>hold_name-001</hold_name><hold_address>hold_address-001</hold_address><hold_country>001</hold_country><hold_lat>hold_lat-1</hold_lat><hold_lon>hold_lon-1</hold_lon><method>acqu</method><genus>genus-001</genus><species>species-001</species><sp_auth>sp_auth-001</sp_auth><subtaxa>subtaxa-001</subtaxa><st_auth>st_auth-001</st_auth><bio_status>001</bio_status><mls_status>01</mls_status><prov_sid>prov_sid-001</prov_sid><provenance>pr1</provenance><coll_sid>coll_sid-001</coll_sid><coll_miss_id>coll_miss_id-001</coll_miss_id><coll_site>coll_site-001</coll_site><coll_lat>coll_lat-1</coll_lat><coll_lon>coll_lon-1</coll_lon><coll_uncert>coll_uncert-001</coll_uncert><coll_datum>coll_datum-001</coll_datum><coll_georef>coll_georef-001</coll_georef><coll_elevation>1</coll_elevation><coll_date>2001-01-01</coll_date><coll_source>s1</coll_source><ancestry>ancestry-001</ancestry>
</Sample>
</soapenv:Body>
</soapenv:Envelope> {org.apache.synapse.mediators.builtin.LogMediator}
это представляет текущий элемент, на котором я итерации. Правильно ли мое рассуждение?
1 ответ
Вы можете использовать любую строку для префикса, просто обязательно используйте ту же строку после xmlns:
xmlns:ds="http://ws.wso2.org/dataservice"
Пример:
<iterate expression="$body//mypref:Sample" id="ITR_AGG" xmlns:mypref="http://ws.wso2.org/dataservice">
$body - это предопределенное выражение xpath для синапса, которое представляет сообщение тела:
https://docs.wso2.com/display/ESB500/Synapse+XPath+Variables$body
Обогащенный посредник:
<enrich>
<source clone="true" type="envelope"/>
<target property="sampleData" type="property"/>
</enrich>
Просто скопируйте содержимое входящего сообщения, всю полезную нагрузку, включая soapevelop, в свойство с именем sampleData.