Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Упростить xslt / 6 сообщений из 6, страница 1 из 1
15.11.2019, 14:55
    #39889675
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить xslt
Как можно упростить xslt?
Многократные повторы <xsl:if>...</xsl:if> заменить на какую-то одну конструкцию, так чтобы если в тегах с inn, vin, lastName, middleName, firstName, birthDate не передано ничего, то соответствующий тег просто не формируется в результирующем xml?

Спасибо!


<?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:if test="rdc:Item/rdc:Value[@Name='vin']!=''">
<xsl:apply-templates select="rdc:Item/rdc:Value"/>
</xsl:if>
</rt:carCriteria>
</xsl:when>
<xsl:when test="rdc:Item[rdc:Value/@Name='inn']">
<rt:organizationCriteria>
<xsl:if test="rdc:Item/rdc:Value[@Name='inn']!=''">
<xsl:apply-templates select="rdc:Item/rdc:Value"/>
</xsl:if>
</rt:organizationCriteria>
</xsl:when>
<xsl:when test="rdc:Item[rdc:Value/@Name='lastName']">
<rt:personCriteria>
<xsl:if test="rdc:Item/rdc:Value[@Name='firstName']!=''">
<xsl:apply-templates select="rdc:Item/rdc:Value[@Name='firstName']"/>
</xsl:if>
<xsl:if test="rdc:Item/rdc:Value[@Name='lastName']!=''">
<xsl:apply-templates select="rdc:Item/rdc:Value[@Name='lastName']"/>
</xsl:if>
<xsl:if test="rdc:Item/rdc:Value[@Name='middleName']!=''">
<xsl:apply-templates select="rdc:Item/rdc:Value[@Name='middleName']"/>
</xsl:if>
<xsl:if test="rdc:Item/rdc:Value[@Name='birthDate']!=''">
<xsl:apply-templates select="rdc:Item/rdc:Value[@Name='birthDate']"/>
</xsl:if>
</rt:personCriteria>
</xsl:when>
<xsl:otherwise>
</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>

Примеры входящих 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>


<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">2L1FK81W7YX914837</Value>
</Item>
</SendRequest>
</soapenv:Body>
</soapenv:Envelope>
...
Рейтинг: 0 / 0
15.11.2019, 17:37
    #39889871
_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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
<?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:if test="rdc:Item/rdc:Value[@Name='vin']!=''">
            <xsl:apply-templates select="rdc:Item/rdc:Value"/>
          </xsl:if>
        </rt:carCriteria>
      </xsl:when>
      <xsl:when test="rdc:Item[rdc:Value/@Name='inn']">
        <rt:organizationCriteria>
          <xsl:if test="rdc:Item/rdc:Value[@Name='inn']!=''">
            <xsl:apply-templates select="rdc:Item/rdc:Value"/>
          </xsl:if>
        </rt:organizationCriteria>
      </xsl:when>
      <xsl:when test="rdc:Item[rdc:Value/@Name='lastName']">
        <rt:personCriteria>
          <xsl:if test="rdc:Item/rdc:Value[@Name='firstName']!=''">
            <xsl:apply-templates select="rdc:Item/rdc:Value[@Name='firstName']"/>
          </xsl:if>
          <xsl:if test="rdc:Item/rdc:Value[@Name='lastName']!=''">
            <xsl:apply-templates select="rdc:Item/rdc:Value[@Name='lastName']"/>
          </xsl:if>
          <xsl:if test="rdc:Item/rdc:Value[@Name='middleName']!=''">
            <xsl:apply-templates select="rdc:Item/rdc:Value[@Name='middleName']"/>
          </xsl:if>
          <xsl:if test="rdc:Item/rdc:Value[@Name='birthDate']!=''">
            <xsl:apply-templates select="rdc:Item/rdc:Value[@Name='birthDate']"/>
          </xsl:if>
        </rt:personCriteria>
      </xsl:when>
      <xsl:otherwise>
      </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>

...
Рейтинг: 0 / 0
15.11.2019, 17:39
    #39889873
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить xslt
Я же вам писал как нужно здесь 21997550 и здесь 22007277 . Вы решили наваять свой велосипед?
...
Рейтинг: 0 / 0
18.11.2019, 09:27
    #39890307
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить xslt
_Vasilisk_,
у меня не в этом был вопрос.
в код добавлены блоки
<xsl:if test="rdc:Item/rdc:Value[@Name='vin']!=''">
</xsl:if>

Они многократно повторяются.
И у Вас в отформатированном повторяются.
Вопрос в том, как задать шаблон, чтобы избежать этих многократных повторов.
Каждый атомарный тег (фамилия, имя, отчество, дата рождения, инн, Vin) - общий принцип: если передано пустое значение, то не выводить этот тег.
Спасибо!
...
Рейтинг: 0 / 0
18.11.2019, 15:01
    #39890546
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить xslt
Код: xml
1.
2.
3.
4.
5.
6.
7.
<xsl:template match="rdc:Value">
  <xsl:if test=". != ''">
    <xsl:element name="{concat('cmn:', @Name)}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:if>
</xsl:template>
...
Рейтинг: 0 / 0
06.02.2020, 10:21
    #39923219
NatM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить xslt
_Vasilisk_,

Как можно данный xml конвертировать в json (используя c# - asp.net) так чтобы в json не было тега <Value Name="birthDate">1972-08-15</Value>, а теги с именем, фамилией, отчеством назывались Имя, Фамилия, Отчество?

<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>



Как можно данный json конвертировать в xml (используя c# - asp.net), чтобы в xml содержалось только 2 тега - Email и Team. Team переименовать в Dpt. И вывести не все подтеги в Dpt, а только один из них - Team.Name.

string json = @"{
'@Id': 1,
'Email': 'james@example.com',
'Active': true,
'CreatedDate': '2013-01-20T00:00:00Z',
'Roles': [
'User',
'Admin'
],
'Team': {
'@Id': 2,
'Name': 'Software Developers',
'Description': 'Creators of fine software products and services.'
}
}";
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Упростить xslt / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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