Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT преобразование / 11 сообщений из 11, страница 1 из 1
18.10.2019, 15:09
    #39878340
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
Запрос:
<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?

Заранее большое спасибо!!
...
Рейтинг: 0 / 0
18.10.2019, 16:03
    #39878373
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
Код: 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.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:rdc="http://www.netvoxlab.ru/SmevRdcService"
  xmlns:cmn="urn://services-gibdd-ru/carservice/commons/1.0.0"
  xmlns:rt="urn://services-gibdd-ru/carservice/root/1.0.0"
  exclude-result-prefixes="soapenv rdc"
  >
  
  <xsl:output encoding="UTF-8" method="xml"/>
  
  <xsl:template match="/soapenv:Envelope">
    <rt:carRegistrationsRequest>
      <xsl:apply-templates select="soapenv:Body/rdc:SendRequest"/>
    </rt:carRegistrationsRequest>
  </xsl:template>
  
  <xsl:template match="rdc:SendRequest">
    <xsl:choose>
      <xsl:when test="rdc:Item[rdc:Value/@Name='vin']">
        <rt:carCriteria>
          <xsl:apply-templates select="rdc:Item/rdc:Value"/>
        </rt:carCriteria>
      </xsl:when>
      <xsl:otherwise>
        <rt:personCriteria>
          <xsl:apply-templates select="rdc:Item/rdc:Value"/>
        </rt:personCriteria>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  
  <xsl:template match="rdc:Value">
    <xsl:element name="{concat('cmn:', @Name)}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>



Два замечания:
1. Тип создаваемого XML определяется на основании наличия элемента
Код: xml
1.
<Value Name="vin">


2. Порядок элементов в выходном файле совпадает с порядком элементов Value
...
Рейтинг: 0 / 0
29.10.2019, 17:56
    #39882867
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
_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""
...
Рейтинг: 0 / 0
29.10.2019, 18:02
    #39882872
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
NatM,

Т.е. как сделать, чтобы результат полностью совпадал с требуемым?
Также в нем должно отсутствовать "encoding="UTF-8" после "?xml version="1.0"". И в нем другой порядок полей (в исходном сначала <Value Name="lastName">ИВАНОВ</Value>, затем - <Value Name="firstName">СЕРГЕЙ</Value>, а в результирующем - наоборот).
...
Рейтинг: 0 / 0
30.10.2019, 15:54
    #39883156
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
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"".Чем он мешает?
...
Рейтинг: 0 / 0
30.10.2019, 16:19
    #39883169
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
_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
...
Рейтинг: 0 / 0
30.10.2019, 16:20
    #39883170
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
Т.е:

Фактический результат преобразования:
<?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>
...
Рейтинг: 0 / 0
30.10.2019, 17:00
    #39883192
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
NatMЕсть расхождения (urn...rt).Я не вижу разницы. Порядок объявления пространств имен не регулируется ни одной рекомендацией W3C
...
Рейтинг: 0 / 0
30.10.2019, 17:01
    #39883193
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
И на этот вопрос_Vasilisk_NatMв нем должно отсутствовать "encoding="UTF-8" после "?xml version="1.0"".Чем он мешает?вы так и не ответили
...
Рейтинг: 0 / 0
31.10.2019, 15:10
    #39883684
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
_Vasilisk_,

Про encoding="UTF-8 и rt, cmn вопрос отпал.
Порядок тегов другой
...
Рейтинг: 0 / 0
31.10.2019, 15:21
    #39883697
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT преобразование
NatMПорядок тегов другойЗамените вот это
_Vasilisk_
Код: xml
1.
2.
3.
<rt:personCriteria>
  <xsl:apply-templates select="rdc:Item/rdc:Value"/>
</rt:personCriteria>

на вот это
Код: xml
1.
2.
3.
4.
5.
6.
<rt:personCriteria>
  <xsl:apply-templates select="rdc:Item/rdc:Value[@Name='firstName']"/>
  <xsl:apply-templates select="rdc:Item/rdc:Value[@Name='lastName']"/>
  <xsl:apply-templates select="rdc:Item/rdc:Value[@Name='middleName']"/>
  <xsl:apply-templates select="rdc:Item/rdc:Value[@Name='birthDate']"/>
</rt:personCriteria>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT преобразование / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]