Доброго всем времени суток.
Суть проблемы такова
есть 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] не работает