Текущее время: Вс, июн 21 2026, 18:10

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: XML -> XSL -> XML - нужна помощь с трансформацией
СообщениеДобавлено: Сб, янв 12 2013, 16:49 
Начинающий
Начинающий

Зарегистрирован:
Сб, янв 12 2013, 10:43
Сообщения: 2
Доброго всем времени суток.

Суть проблемы такова

есть csv файлик, он забирается XI с фтп сервера, трансформируется в xml через MessageTransformBean, получаю xml; эту xml надо отправить в оракловскую базу.

файлик вида:

Code:
333333,Иванов,Иван,Иванович
328777,Петров,Петр,Петрович
322222,Кириллов,Кирилл,Кириллович
333333,10120130800,10120132200
333333,20120130800,80120132200
322222,30120130800,30120132200



настройки модуля MessageTransformBean
Изображение

получается xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<ns:mt_Fromfile xmlns:ns="urn:test.ru:test">
      <tabfiodate>
         <tabnum>333333</tabnum>
         <add_inf1>Иванов</add_inf1>
         <add_inf2>Иван</add_inf2>
         <add_inf3>Иванович</add_inf3>
      </tabfiodate>
      <tabfiodate>
         <tabnum>328777</tabnum>
         <add_inf1>Петров</add_inf1>
         <add_inf2>Петр</add_inf2>
         <add_inf3>Петрович</add_inf3>
      </tabfiodate>
      <tabfiodate>
         <tabnum>322222</tabnum>
         <add_inf1>Кириллов</add_inf1>
         <add_inf2>Кирилл</add_inf2>
         <add_inf3>Кириллович</add_inf3>
      </tabfiodate>
      <tabfiodate>
         <tabnum>333333</tabnum>
         <add_inf1>10120130800</add_inf1>
         <add_inf2>10120132200</add_inf2>
      </tabfiodate>
      <tabfiodate>
         <tabnum>333333</tabnum>
         <add_inf1>20120130800</add_inf1>
         <add_inf2>80120132200</add_inf2>
      </tabfiodate>
      <tabfiodate>
         <tabnum>322222</tabnum>
         <add_inf1>30120130800</add_inf1>
         <add_inf2>30120132200</add_inf2>
      </tabfiodate>
</ns:mt_Fromfile>


итоговая xml должна быть такой, что точно отправится по назначению в оракл - 1й вариант
Code:
<?xml version="1.0" encoding="utf-8"?>
<mt_Oracle xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <tabfiodate>
      <tabfio>
         <Transaction action="insert">
            <table>tabfio</table>
            <access>
               <tabnum>333333</tabnum>
               <fam>Иванов</fam>
               <name1>Иван</name1>
               <midname>Иванович</midname>
            </access>
            <access>
               <tabnum>328777</tabnum>
               <fam>Петров</fam>
               <name1>Петр</name1>
               <midname>Петрович</midname>
            </access>
            <access>
               <tabnum>322222</tabnum>
               <fam>Кириллов</fam>
               <name1>Кирилл</name1>
               <midname>Кириллович</midname>
            </access>
         </Transaction>
      </tabfio>
      <tabdate>
         <Transaction action="insert">
            <table>tabdatetime</table>
            <access>
               <tabnum>333333</tabnum>
               <datetimestart>10120130800</datetimestart>
               <datetimeend>10120132200</datetimeend>
            </access>
            <access>
               <tabnum>333333</tabnum>
               <datetimestart>20120130800</datetimestart>
               <datetimeend>80120132200</datetimeend>
            </access>
            <access>
               <tabnum>322222</tabnum>
               <datetimestart>30120130800</datetimestart>
               <datetimeend>30120132200</datetimeend>
            </access>
         </Transaction>
      </tabdate>
   </tabfiodate>
</mt_Oracle>


или хотя бы такой (просто не уверен что обработается ) - 2й вариант
Code:
<?xml version="1.0" encoding="UTF-8"?>
<mt_Oracle xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <Transaction action="insert">
      <table>tabfio</table>
      <access>
         <TABNUM>333333</TABNUM>
         <NAME1>Иванов</NAME1>
         <MIDNAME>Иван</MIDNAME>
         <FAM>Иванович</FAM>
      </access>
   </Transaction>
   <Transaction action="insert">
      <table>tabfio</table>
      <access>
         <TABNUM>328777</TABNUM>
         <NAME1>Петров</NAME1>
         <MIDNAME>Петр</MIDNAME>
         <FAM>Петрович</FAM>
      </access>
   </Transaction>
   <Transaction action="insert">
      <table>tabfio</table>
      <access>
         <TABNUM>322222</TABNUM>
         <NAME1>Кириллов</NAME1>
         <MIDNAME>Кирилл</MIDNAME>
         <FAM>Кириллович</FAM>
      </access>
   </Transaction>
   <Transaction action="insert">
      <table>tabfiodate</table>
      <access>
         <TABNUM>333333</TABNUM>
         <DATETIMESTART>10120130800</DATETIMESTART>
         <DATETIMEEND>10120132200</DATETIMEEND>
      </access>
   </Transaction>
   <Transaction action="insert">
      <table>tabfiodate</table>
      <access>
         <TABNUM>333333</TABNUM>
         <DATETIMESTART>20120130800</DATETIMESTART>
         <DATETIMEEND>80120132200</DATETIMEEND>
      </access>
   </Transaction>
   <Transaction action="insert">
      <table>tabfiodate</table>
      <access>
         <TABNUM>322222</TABNUM>
         <DATETIMESTART>30120130800</DATETIMESTART>
         <DATETIMEEND>30120132200</DATETIMEEND>
      </access>
   </Transaction>
</mt_Oracle>


Беда в том что не получается сделать трансформацию до тех пол пока не сделаю корневой сегмент в исходной xml, а в xsl подставить название этого же сегмента в template - например
Code:
<?xml version="1.0" encoding="utf-8"?>
<ns:mt_Fromfile xmlns:ns="urn:test.ru:test">
   <tabfio>
      <tabfiodate>
........
</tabfiodate>
........
<tabfiodate>
........
</tabfiodate>
   </tabfio>
</ns:mt_Fromfile>



xsl вот
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <xsl:output method="xml"/>
   <xsl:template match="/"> <!--сюда собствеенно если подставить "tabfio" вместо "/" , и заключить исходную xml в начальный сегмент <tabfio>, то получится 2й вариант-->
      <mt_Oracle>
         <xsl:for-each select="tabfiodate">
            <xsl:choose>
               <xsl:when test="add_inf2 > 0 ">
                  <Transaction action="insert">
                     <table>tabfiodate</table>
                     <access>
                        <TABNUM>
                           <xsl:value-of select="tabnum"/>
                        </TABNUM>
                        <DATETIMESTART>
                           <xsl:value-of select="add_inf1"/>
                        </DATETIMESTART>
                        <DATETIMEEND>
                           <xsl:value-of select="add_inf2"/>
                        </DATETIMEEND>
                     </access>
                  </Transaction>
               </xsl:when>
               <xsl:otherwise>
                  <Transaction action="insert">
                     <table>tabfio</table>
                     <access>
                        <TABNUM>
                           <xsl:value-of select="tabnum"/>
                        </TABNUM>
                        <NAME1>
                           <xsl:value-of select="add_inf1"/>
                        </NAME1>
                        <MIDNAME>
                           <xsl:value-of select="add_inf2"/>
                        </MIDNAME>
                        <FAM>
                           <xsl:value-of select="add_inf3"/>
                        </FAM>
                     </access>
                  </Transaction>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:for-each>
      </mt_Oracle>
   </xsl:template>
</xsl:stylesheet>


собственно вопрос : как это сделать ? ведь каждый раз в файлике csv дикое кол-во строк
либо добавить корневой сегмент в начальную xml, либо в xsl избавиться от зависимости от template. Altova XML SPY после трансформации выдает лишь заголовок

PS
извиняюсь за вставку такого кол-ва кода, но почему то [spoiler] [/spoiler] не работает


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XML -> XSL -> XML - нужна помощь с трансформацией
СообщениеДобавлено: Пн, янв 14 2013, 11:37 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
прочитал не всё. Если стоит проблема определять имя корневого элемента и по нему реагировать, то

<xsl:template match="/element1">
...
</xsl:template>

<xsl:template match="/element2">
...
</xsl:template>

будет два статических обработчика на корневой элемент. Или:
<xsl:template match="/*[name()!='']">
<xsl:variable name="root" select="name()"/>
</xsl:template>

Обработчик на корневой элемент с пропуском пробелов до значимого корня, а в $root будет имя корня, скорее всего неквалифицированное.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XML -> XSL -> XML - нужна помощь с трансформацией
СообщениеДобавлено: Ср, янв 16 2013, 15:53 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, дек 06 2011, 10:11
Сообщения: 78
Code:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns="urn:test.ru:test"
    version="1.0">

<xsl:template match="/">
     <xsl:variable name="Root_FIO" select="/ns:mt_Fromfile/tabfiodate[add_inf3]"/>
     <xsl:variable name="Root_Dates" select="/ns:mt_Fromfile/tabfiodate[not(add_inf3)]"/>
     <mt_Oracle xmlns:fo="http://www.w3.org/1999/XSL/Format">
         <tabfiodate>
             <settime>
                 <settime action="SQL_DML">
                     <access>alter session set nls_date_format = 'YYYYMMDDHH24MISS'</access>
                 </settime>
             </settime>       

           <xsl:if test="count($Root_FIO)>0">
             <tabfio>
                 <Transaction action="INSERT">
                     <table>tabfio</table>
                     <xsl:for-each select="$Root_FIO">
                        <access>
                            <tabnum><xsl:value-of select="./tabnum"/></tabnum>
                            <fam><xsl:value-of select="./add_inf1"/></fam>
                            <name1><xsl:value-of select="./add_inf2"/></name1>
                            <midname><xsl:value-of select="./add_inf3"/></midname>
                        </access>
                     </xsl:for-each>
                     
                 </Transaction>
             </tabfio>
           </xsl:if>
           <xsl:if test="count($Root_Dates)>0">
               <tabdate>
                   <Transaction action="insert">
                       <table>tabdatetime</table>
                       <xsl:for-each select="$Root_Dates">
                           <access>
                               <tabnum><xsl:value-of select="./tabnum"/></tabnum>
                               <datetimestart><xsl:value-of select="./add_inf1"/></datetimestart>
                               <datetimeend><xsl:value-of select="./add_inf2"/></datetimeend>
                            </access>
                       </xsl:for-each>   
                   </Transaction>
                </tabdate>                   
           </xsl:if>
         </tabfiodate>
       </mt_Oracle>
</xsl:template>
</xsl:stylesheet>



Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XML -> XSL -> XML - нужна помощь с трансформацией
СообщениеДобавлено: Вт, янв 22 2013, 19:35 
Начинающий
Начинающий

Зарегистрирован:
Сб, янв 12 2013, 10:43
Сообщения: 2
Большое спасибо!!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB