powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT преобразование
11 сообщений из 11, страница 1 из 1
XSLT преобразование
    #39878340
NatM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос:
<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
XSLT преобразование
    #39878373
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
XSLT преобразование
    #39882867
NatM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
XSLT преобразование
    #39882872
NatM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NatM,

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

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

Про encoding="UTF-8 и rt, cmn вопрос отпал.
Порядок тегов другой
...
Рейтинг: 0 / 0
XSLT преобразование
    #39883697
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
11 сообщений из 11, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT преобразование
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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