Текущее время: Пт, мар 29 2024, 07:45

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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