Формирование Xml (с использованием xslt)

Xml разработанной формы можно сформировать в конструкторе, в режиме предпросмотра формы. Предварительно создано событие на форме (Рис.6):

Рисунок 6. Событие для формы

Для его редактирования необходимо щелкнуть на нем, после чего откроется окно (Рис.7):

Рисунок 7. Настройка события для формы

Тип события: submit (отправка данных), init (инициализация), change (изменение), final (конечная отправка данных). Обязательный параметр для формирования Xml в конструкторе;
Service key: - указывается ключ в juddi для данной услуги. Обязательный параметр для формирования Xml в конструкторе (обычно указывается мнемоника формы, если на данный момент не известна мнемоника формы, то можно указать id формы, а потом обновить);
Soap action: - указывается при наличии. Необязательный параметр для формирования Xml в конструкторе;
AppData Transformer: - указывается код шаблона xslt-преобразования блока Appdata (для услуг по МР 2.4 и выше). Необязательный параметр для формирования Xml в конструкторе;
Request Transformer: - указывается код шаблона xslt-преобразования запроса. Необязательный параметр для формирования Xml в конструкторе;
Response Transformer: - указывается код шаблона xslt-преобразования ответа на запрос. Необязательный параметр для формирования Xml в конструкторе;
Submit type: - указывается тип отправки (FINAL - конечная отправка данных; SYNC - синхронная отправка; ASYNC - асинхронная отправка). Обязательный параметр для формирования Xml в конструкторе (FINAL);
xmlPayloadType: - указывается тип xml (PUBLIC_API_XML - формируется xml с набором вложенных объектов, с обязательно наименованными тегами; PUBLIC_API_XML - выбирается (но не обязательно) в случае применения xslt; PRIMARY_XML – формируется xml без вложенных объектов, SOAP-запрос)

После нажатия на кнопку Предпросмотр формы, необходимо заполнить поля формы и нажать на кнопку Перейти к подаче заявления. После этого появится окно xml формы:

Рисунок 8. xml формы (submit, FINAL, PUBLIC_API_XML)

В случае, если на стороне ведомства такая структура xml не проходит (например, когда веб-сервис уже разработан и принимает запрос в определенном формате), в этом случае можно выполнить преобразование xml с помощью xslt. Контрольные примеры запроса и ответа на запрос, как правило, указываются в ТЗ, либо в руководстве пользователя веб-сервиса при регистрации в СМЭВ.

Чтобы создать xslt-шаблон нужно в конструкторе нажать на кнопку Загрузить XSLT (Рис. 9)

Рисунок 9. Окно выбора xslt-шаблона или создание нового

При нажатии кнопки Новый, откроется окно для ввода данных по новому xslt-шаблону (Рис. 10):

Рисунок 10. Окно создания нового xslt-шаблона

где,

Код системы – код ведомства;

Код сервисы – мнемоника формы, либо другая понятная разработчику аббревиатура;

Содержимое файла – текст разработанного xslt-шаблона

При нажатии на кнопку Редактировать, откроется окно с возможностью правки xslt-шаблона (Рис.11):

Рисунок 1. Режим редактирования xslt-шаблона

На текущий момент конструктор не имеет возможности автоматически генерировать xslt-шаблон, поэтому для разработки и проверки xslt-шаблона необходимо использовать сторонние ресурсы (например, https://www.w3schools.com/xsl/, https://ftemk.mpei.ac.ru/xslt/)

Чтобы на форму назначить xslt-шаблон заявления, необходимо в событии для формы в поле
Request Transformer: выбрать нужный шаблон (Рис.12):

Рисунок 12. выбор xslt-шаблона в событии

Корректность xslt-шаблона можно проверить в режиме предпросмотра формы – если после нажатия на кнопку «Перейти к подаче заявления» появилось окно xml формы, внутри которого указана Xml заявления с веденными данными на форме после xslt.

Пример xml без использования xslt-шаблона:

<?xml version="1.0" encoding="utf-8"?><Form xmlns:ns2="https://smev.gosuslugi.ru/request/rev111111" xmlns="https://idecs.atc.ru/pgufg/ws/fgapc/" xmlns:ns4="https://idecs.atc.ru/pgufg/ws/processing/" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="ns4:FormData">

<mnemonic>10000000658</mnemonic>

<version>12345</version>

<object>

<code>form</code>

<object>

<code>FormStep11</code>

<object>

<code>Panel12</code>

<object>

<code>FieldCheckbox232</code>

<value>true</value>

<attrs>

<entry>

<key>textValue</key>

<value>Да</value>

</entry>

</attrs>

</object>

</object>

</object>

<object>

<code>step</code>

<object>

<code>panel_fl</code>

<object>

<code>e_mail</code>

<value>test@test.com</value>

</object>

<object>

<code>first_name</code>

<value>Иван</value>

</object>

<object>

<code>inn</code>

<value>1234567890</value>

</object>

<object>

<code>last_name</code>

<value>Иванов</value>

</object>

<object>

<code>middle_name</code>

<value>Иванович</value>

</object>

<object>

<code>snils</code>

<value>000-000-000 00</value>

</object>

</object>

<object>

<code>panel_info</code>

<object>

<code>order_type</code>

<value>information</value>

<attrs>

<entry>

<key>textValue</key>

<value>Получить информацию из реестра лицензий на осуществление телевизионного вещания и (или) радиовещания на территории Российской Федерации в личный кабинет портала государственных услуг</value>

</entry>

</attrs>

</object>

</object>

<object>

<code>panel_kladr</code>

<object>

<code>Kladr37</code>

<attrs>

<entry>

<key>region</key>

<value/>

</entry>

<entry>

<key>town_code</key>

<value/>

</entry>

<entry>

<key>street</key>

<value/>

</entry>

<entry>

<key>building1</key>

<value/>

</entry>

<entry>

<key>apartment</key>

<value/>

</entry>

<entry>

<key>building2</key>

<value/>

</entry>

<entry>

<key>house</key>

<value/>

</entry>

<entry>

<key>taxCode</key>

<value/>

</entry>

<entry>

<key>city</key>

<value/>

</entry>

<entry>

<key>taxAreaCode</key>

<value/>

</entry>

<entry>

<key>district_code</key>

<value/>

</entry>

<entry>

<key>post_index</key>

<value/>

</entry>

<entry>

<key>region_code</key>

<value/>

</entry>

<entry>

<key>city_code</key>

<value/>

</entry>

<entry>

<key>town</key>

<value/>

</entry>

<entry>

<key>street_code</key>

<value/>

</entry>

<entry>

<key>district</key>

<value/>

</entry>

</attrs>

</object>

</object>

<object>

<code>panel_lisence</code>

<object>

<code>lic_name</code>

<value>test</value>

</object>

<object>

<code>lic_number</code>

<value>123</value>

</object>

</object>

<object>

<code>panel_recieve</code>

<object>

<code>receive_type</code>

<value>edsdoc</value>

<attrs>

<entry>

<key>textValue</key>

<value>Получить в форме электронного документа, подписанного электронной подписью (на Портале Государственных услуг)</value>

</entry>

</attrs>

</object>

</object>

<object>

<code>panel_ul</code>

<object>

<code>date_ogrn</code>

<attrs>

<entry>

<key>timestamp</key>

<value/>

</entry>

<entry>

<key>timezone</key>

<value/>

</entry>

<entry>

<key>minutes</key>

<value/>

</entry>

<entry>

<key>second</key>

<value/>

</entry>

<entry>

<key>hours</key>

<value/>

</entry>

<entry>

<key>month</key>

<value/>

</entry>

<entry>

<key>year</key>

<value/>

</entry>

<entry>

<key>format</key>

<value/>

</entry>

<entry>

<key>date</key>

<value/>

</entry>

</attrs>

</object>

<object>

<code>opf</code>

<attrs>

<entry>

<key>text_value</key>

<value/>

</entry>

<entry>

<key>pageNum</key>

<value>1</value>

</entry>

</attrs>

</object>

</object>

<object>

<code>panel_user_type</code>

<object>

<code>user_type</code>

<value>PERSON_RF</value>

</object>

</object>

</object>

</object>

</Form>

Пример xml с использованием xslt-шаблона:

<?xml version="1.0" encoding="utf-8"?><rkn:Data xmlns:rkn="https://rsoc.ru/services/pgu" xmlns:ws="https://ws.unisoft" xmlns:soapenv="https://schemas.xmlsoap.org/soap/envelope/" xmlns:apc="https://idecs.atc.ru/pgufg/ws/fgapc/"> <rkn:FormData> <application> <form> <user_type>2</user_type> <snils>000-000-000 00</snils> <last_name>Иванов</last_name> <first_name>Иван</first_name> <middle_name>Иванович</middle_name> <inn>1234567890</inn> <e_mail>test@test.com</e_mail> <order_type>information</order_type> <lic_name>test</lic_name> <lic_number>123</lic_number> <where>100</where> </form> </application> </rkn:FormData></rkn:Data>

Пример xslt-шаблона который приводит данное преобразование:

<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="1.0" xmlns:apc="https://idecs.atc.ru/pgufg/ws/fgapc/" xmlns:soapenv="https://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="https://ws.unisoft" xmlns:xsl="https://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="utf-8"/> <xsl:template match="apc:Form"> <rkn:Data xmlns:rkn="https://rsoc.ru/services/pgu" > <rkn:FormData> <application> <form> <xsl:variable name="userType"> <xsl:choose> <xsl:when test="//apc:object[apc:code='user_type']/apc:value = 'EMPLOYEE'">0</xsl:when> <xsl:when test="//apc:object[apc:code='user_type']/apc:value = 'BUSINESSMAN'">1</xsl:when> <xsl:when test="//apc:object[apc:code='user_type']/apc:value = 'PERSON_RF'">2</xsl:when> <xsl:when test="//apc:object[apc:code='user_type']/apc:value = 'PERSON_FOREIGN'">3</xsl:when> </xsl:choose> </xsl:variable> <xsl:variable name="receive_type" select="//apc:object[apc:code='receive_type']/apc:value"/> <xsl:variable name="order_type" select="//apc:object[apc:code='order_type']/apc:value"/> <user_type> <xsl:value-of select="$userType"/> </user_type> <!-- Содержание заявки для юридического лица user_type=0--> <xsl:if test = "$userType = '0'" > <opf> <xsl:value-of select="//apc:object[apc:code='opf']/apc:value"/> </opf> <name_full> <xsl:value-of select="//apc:object[apc:code='name_full']/apc:value"/> </name_full> <ogrn> <xsl:value-of select="//apc:object[apc:code='ogrn']/apc:value"/> </ogrn> <date_ogrn> <xsl:value-of select="//apc:object[apc:code='date_ogrn']/apc:value"/> </date_ogrn> <inn> <xsl:value-of select="//apc:object[apc:code='inn']/apc:value"/> </inn> </xsl:if> <!-- Содержание заявки для физического лица user_type=2--> <xsl:if test = "$userType = '2'" > <snils> <xsl:value-of select="//apc:object[apc:code='snils']/apc:value"/> </snils> <last_name> <xsl:value-of select="//apc:object[apc:code='last_name']/apc:value"/> </last_name> <first_name> <xsl:value-of select="//apc:object[apc:code='first_name']/apc:value"/> </first_name> <middle_name> <xsl:value-of select="//apc:object[apc:code='middle_name']/apc:value"/> </middle_name> <inn> <xsl:value-of select="//apc:object[apc:code='inn']/apc:value"/> </inn> </xsl:if> <!-- Содержание заявки для индивидуального предпринимателя user_type=1--> <xsl:if test = "$userType = '1'" > <name_full> <xsl:value-of select="//apc:object[apc:code='name_full']/apc:value"/> </name_full> <inn> <xsl:value-of select="//apc:object[apc:code='inn']/apc:value"/> </inn> </xsl:if> <!-- Содержание заявки для иностранного гражданина user_type=3--> <xsl:if test = "$userType = '3'" > <last_name> <xsl:value-of select="//apc:object[apc:code='last_name']/apc:value"/> </last_name> <first_name> <xsl:value-of select="//apc:object[apc:code='first_name']/apc:value"/> </first_name> <middle_name> <xsl:value-of select="//apc:object[apc:code='middle_name']/apc:value"/> </middle_name> <nation> <xsl:value-of select="//apc:object[apc:code='nation']/apc:value"/> </nation> </xsl:if> <e_mail> <xsl:value-of select="//apc:object[apc:code='e_mail']/apc:value"/> </e_mail> <!-- Общая часть--> <order_type> <xsl:value-of select="$order_type"/> </order_type> <!-- cпособ получения ответа order_type=extract--> <xsl:if test = "$order_type = 'extract'" > <receive_type> <xsl:value-of select="//apc:object[apc:code='receive_type']/apc:value"/> </receive_type> </xsl:if> <!-- адрес receive_type=post--> <xsl:if test = "$receive_type = 'post'" > <xsl:variable name="address" select="//apc:object[apc:code='Kladr37']"/> <post_addressIndex><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'post_index']/apc:value"/></post_addressIndex> <!--Виджет КЛАДР--> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'region_code']/apc:value!= ''"> <post_addressRegion><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'region_code']/apc:value"/></post_addressRegion> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'region']/apc:value!= ''"> <post_addressRegionText><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'region']/apc:value"/></post_addressRegionText> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'district_code']/apc:value!= ''"> <post_addressRaion><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'district_code']/apc:value"/></post_addressRaion> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'district']/apc:value!= ''"> <post_addressRaionText><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'district']/apc:value"/></post_addressRaionText> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'city_code']/apc:value!= ''"> <post_addressCity><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'city_code']/apc:value"/></post_addressCity> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'city']/apc:value!= ''"> <post_addressCityText><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'city']/apc:value"/></post_addressCityText> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'town_code']/apc:value!= ''"> <post_addressSettlement><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'town_code']/apc:value"/></post_addressSettlement> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'town']/apc:value!= ''"> <post_addressSettlementText><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'town']/apc:value"/></post_addressSettlementText> </xsl:if> </xsl:if> <!--Не виджет КЛАДР--> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'region_code']/apc:value = ''"> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'region']/apc:value!= ''"> <post_addressRegionNK><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'region']/apc:value"/></post_addressRegionNK> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'district']/apc:value!= ''"> <post_addressRaionNK><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'district']/apc:value"/></post_addressRaionNK> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'city']/apc:value!= ''"> <post_addressCityNK><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'city']/apc:value"/></post_addressCityNK> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'town']/apc:value!= ''"> <post_addressSettlementNK><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'town']/apc:value"/></post_addressSettlementNK> </xsl:if> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'street_code']/apc:value!= ''"> <post_addressStreet><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'street_code']/apc:value"/></post_addressStreet> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'street']/apc:value!= ''"> <post_addressStreetText><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'street']/apc:value"/></post_addressStreetText> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'house']/apc:value!= ''"> <post_addressHouse><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'house']/apc:value"/></post_addressHouse> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'building1']/apc:value!= ''"> <post_addressBld><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'building1']/apc:value"/></post_addressBld> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'building2']/apc:value!= ''"> <post_addressStr><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'building2']/apc:value"/></post_addressStr> </xsl:if> <xsl:if test="$address/apc:attrs/apc:entry[apc:key = 'apartment']/apc:value!= ''"> <post_addressFlat><xsl:value-of select="$address/apc:attrs/apc:entry[apc:key = 'apartment']/apc:value"/></post_addressFlat> </xsl:if> <post_addressOther><xsl:value-of select="//apc:object[apc:code='post_addressOther']/apc:value"/></post_addressOther> </xsl:if> <!-- Общая часть--> <lic_name> <xsl:value-of select="//apc:object[apc:code='lic_name']/apc:value"/> </lic_name> <lic_number> <xsl:value-of select="//apc:object[apc:code='lic_number']/apc:value"/> </lic_number> <where>100</where> </form> </application> </rkn:FormData> </rkn:Data> </xsl:template></xsl:stylesheet>

Если после нажатия на кнопку «Перейти к подаче заявления» окно xml формы не появилось или в нем ничего нет (либо текст ошибки), то это значит, что xslt-шаблон некорректно работает.

Аналогично формируется xslt-шаблон для блока Appdata, если по требованиям к сервису в нем передаются данные. Требования к сервису ведомства можно узнать в ТЗ, либо в руководстве пользователя веб-сервиса, указанном при регистрации в СМЭВ.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: