|
XSLT преобразование
|
|||
---|---|---|---|
#18+
Запрос: <soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <SendRequest xmlns=" http://www.netvoxlab.ru/SmevRdcService"> <ServiceCode>smev3GIBDDInfo</ServiceCode> <Value Name="TestMessage">true</Value> <Item Name="request" xmlns=" http://www.netvoxlab.ru/SmevRdcService"> <Value Name="lastName">СЕРГЕЕВ</Value> <Value Name="firstName">ИВАН</Value> <Value Name="middleName">НИКОЛАЕВИЧ</Value> <Value Name="birthDate">1972-08-15</Value> </Item> </SendRequest> </soapenv:Body> </soapenv:Envelope> Требуется преобразовать в: <?xml version="1.0"?> <rt:carRegistrationsRequest xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0" xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0"><rt:personCriteria> <cmn:firstName>ИВАН</cmn:firstName><cmn:lastName>СЕРГЕЕВ</cmn:lastName><cmn:middleName>НИКОЛАЕВИЧ</cmn:middleName><cmn:birthDate>1972-08-15</cmn:birthDate></rt:personCriteria></rt:carRegistrationsRequest> Просьба помочь составить шаблон xslt. Также как сделать этот шаблон xslt универсальным? Чтобы этот шаблон xslt применялся для 2 типов xml? Т.е. как прописать в этом xslt еще одно преобразование, чтобы: 1. описанное выше преобразование применялось только для описанных выше xml. 2. а преобразование №2 применялось только для запросов xml типа 2. xml типа 2: <soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <SendRequest xmlns=" http://www.netvoxlab.ru/SmevRdcService"> <ServiceCode>smev3GIBDDInfo</ServiceCode> <Value Name="TestMessage">true</Value> <Item Name="request" xmlns=" http://www.netvoxlab.ru/SmevRdcService"> <Value Name="vin">2F1FK91W7YY819789</Value> </Item> </SendRequest> </soapenv:Body> </soapenv:Envelope> требуемый формат для xml типа 2: <?xml version="1.0" encoding="UTF-8"?> <rt:carRegistrationsRequest xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0" xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0"><rt:carCriteria><cmn:vin>2F1FK91W7YY81978</cmn:vin></rt:carCriteria></rt:carRegistrationsRequest> Пытались делать: <xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*" name="identity"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> </xsl:stylesheet> Копирует все полностью. Здесь дело в пространстве имен... И в том как прописать, что нужно копировать только в отношении части узлов + создать новую структуру узлов + перевести все в новое пространство имен. Запрос: */soapenv:Body/*[local-name() = 'SendRequest']/*[local-name() = 'Item']/*[local-name() = 'Value'] Возвращает все элементы, значения которых в новом xml идентичны значениям в исходном xml: <Value xmlns=" http://www.netvoxlab.ru/SmevRdcService" Name="lastName">ИВАНОВ</Value> <Value xmlns=" http://www.netvoxlab.ru/SmevRdcService" Name="firstName">СЕРГЕЙ</Value> <Value xmlns=" http://www.netvoxlab.ru/SmevRdcService" Name="middleName">НИКОЛАЕВИЧ</Value> <Value xmlns=" http://www.netvoxlab.ru/SmevRdcService" Name="birthDate">1972:08:15</Value> Но если применять template к ним, то выдает ошибку. Как это все объединить в одном шаблоне xslt? Заранее большое спасибо!! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 15:09 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
Два замечания: 1. Тип создаваемого XML определяется на основании наличия элемента Код: xml 1.
2. Порядок элементов в выходном файле совпадает с порядком элементов Value ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 16:03 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
_Vasilisk_, большое спасибо! Для других случаев также получилось добавить, например: </xsl:when> <xsl:when test="rdc:Item[rdc:Value/@Name='inn']"> <rt:organizationCriteria> <xsl:apply-templates select="rdc:Item/rdc:Value"/> </rt:organizationCriteria> </xsl:when> Но хочу уточнить: Данный xml: <soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <SendRequest xmlns=" http://www.netvoxlab.ru/SmevRdcService"> <ServiceCode>smev3GIBDDInfo</ServiceCode> <Value Name="TestMessage">true</Value> <Item Name="request" xmlns=" http://www.netvoxlab.ru/SmevRdcService"> <Value Name="lastName">ИВАНОВ</Value> <Value Name="firstName">СЕРГЕЙ</Value> <Value Name="middleName">НИКОЛАЕВИЧ</Value> <Value Name="birthDate">1972-08-15</Value> </Item> </SendRequest> </soapenv:Body> </soapenv:Envelope> Преобразовывает в: <?xml version="1.0" encoding="UTF-8"?> <rt:carRegistrationsRequest xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0" xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0"><rt:personCriteria><cmn:lastName>ИВАНОВ</cmn:lastName><cmn:firstName>СЕРГЕЙ</cmn:firstName><cmn:middleName>НИКОЛАЕВИЧ</cmn:middleName><cmn:birthDate>1972-08-15</cmn:birthDate></rt:personCriteria></rt:carRegistrationsRequest> А нужно: <?xml version="1.0"?> <rt:carRegistrationsRequest xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0" xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0"><rt:personCriteria><cmn:firstName>СЕРГЕЙ</cmn:firstName><cmn:lastName>ИВАНОВ</cmn:lastName><cmn:middleName>НИКОЛАЕВИЧ</cmn:middleName><cmn:birthDate>1972-08-15</cmn:birthDate></rt:personCriteria></rt:carRegistrationsRequest> Как сделать, чтобы в этом фрагменте не было расхождений? "xmlns: rt="urn ://services-gibdd-ru/carservice/root/1.0.0" xmlns: cmn="urn ://services-gibdd-ru/carservice/commons/1.0.0"" ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2019, 17:56 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
NatM, Т.е. как сделать, чтобы результат полностью совпадал с требуемым? Также в нем должно отсутствовать "encoding="UTF-8" после "?xml version="1.0"". И в нем другой порядок полей (в исходном сначала <Value Name="lastName">ИВАНОВ</Value>, затем - <Value Name="firstName">СЕРГЕЙ</Value>, а в результирующем - наоборот). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2019, 18:02 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
NatMКак сделать, чтобы в этом фрагменте не было расхождений? "xmlns: rt="urn ://services-gibdd-ru/carservice/root/1.0.0" xmlns: cmn="urn ://services-gibdd-ru/carservice/commons/1.0.0""Не понял вопроса NatMв нем должно отсутствовать "encoding="UTF-8" после "?xml version="1.0"".Чем он мешает? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 15:54 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
_Vasilisk_, В правильном результирующем xml должно быть написано: <rt:carRegistrationsRequest xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0" xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0">. А получается: <rt:carRegistrationsRequest xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0" xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0"> Есть расхождения (urn...rt). И порядок тегов (сначала firstName). Тест проводился здесь: https://online-toolz.com/tools/xslt-transformation.php ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 16:19 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
Т.е: Фактический результат преобразования: <?xml version="1.0" encoding="UTF-8"?> <rt:carRegistrationsRequest xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0" xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0"><rt:personCriteria><cmn:lastName>ИВАНОВ</cmn:lastName><cmn:firstName>СЕРГЕЙ</cmn:firstName><cmn:middleName>НИКОЛАЕВИЧ</cmn:middleName><cmn:birthDate>1972-08-15</cmn:birthDate></rt:personCriteria></rt:carRegistrationsRequest> Целевой результат преобразования: <?xml version="1.0"?> <rt:carRegistrationsRequest xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0" xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0"><rt:personCriteria><cmn:firstName>СЕРГЕЙ</cmn:firstName><cmn:lastName>ИВАНОВ</cmn:lastName><cmn:middleName>НИКОЛАЕВИЧ</cmn:middleName><cmn:birthDate>1972-08-15</cmn:birthDate></rt:personCriteria></rt:carRegistrationsRequest> ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 16:20 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
NatMЕсть расхождения (urn...rt).Я не вижу разницы. Порядок объявления пространств имен не регулируется ни одной рекомендацией W3C ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:00 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
И на этот вопрос_Vasilisk_NatMв нем должно отсутствовать "encoding="UTF-8" после "?xml version="1.0"".Чем он мешает?вы так и не ответили ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:01 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
_Vasilisk_, Про encoding="UTF-8 и rt, cmn вопрос отпал. Порядок тегов другой ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2019, 15:10 |
|
XSLT преобразование
|
|||
---|---|---|---|
#18+
NatMПорядок тегов другойЗамените вот это _Vasilisk_ Код: xml 1. 2. 3.
на вот это Код: xml 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2019, 15:21 |
|
|
start [/forum/topic.php?fid=14&fpage=2&tid=1331914]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
590ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 298ms |
total: | 1001ms |
0 / 0 |