Вчера наконец-то удалось выделить время и довести выгрузку до ума
Выгружается древовидный прайс-лист, пока что только сами данные без описания используемых типов и метаданных (дата выгрузки, автор и тп). Описание переменных думаю брать из филд каталога.
Code:
<?xml version="1.0" encoding="utf-8"?>
<categories>
<category name="NORMAL">
<node name="ADOBE SYSTEMS" level="1">
<node name="Not defined" level="2">
<node name="BOX" level="3">
<node name="InfraStruXure Type A" level="4"/>
</node>
</node>
<node name="Активное сетевое оборудование" level="2">
<node name="Call Centre" level="3">
<node name="IP Телефония" level="4"/>
<data>
<line>
<MATNR>000000000000000701</MATNR>
<MATERIAL_TEXT> Тестовый материал 701</MATERIAL_TEXT>
<MFRPN>12345</MFRPN>
<CHARG/>
<MTART>ZHAW</MTART>
<MATKL>0270</MATKL>
<SOBKZ/>
<KZKFG/>
<STOCKRF>25</STOCKRF>
<STOCKRF_FREE>20</STOCKRF_FREE>
<TRANSIT>10</TRANSIT>
<TRANSIT_FREE>10</TRANSIT_FREE>
<STOCKRM>5</STOCKRM>
<STOCKRM_FREE>0</STOCKRM_FREE>
<ORDERED>20</ORDERED>
<ORDERED_FREE>20</ORDERED_FREE>
<MEINS>ST</MEINS>
<QUANTITY>0</QUANTITY>
<MEINH/>
<COL1>0.0</COL1>
<COL2>0.0</COL2>
<COL3>0.0</COL3>
<MOD_PRICE>0.0</MOD_PRICE>
<DISCOUNT>0.0</DISCOUNT>
<SUMM>0.0</SUMM>
<KONWA/>
<HAS_SCALE/>
<ZCOMMENT/>
</line>
</data>
</node>
</node>
</node>
<node name="ALCATEL" level="1">
<node name="Активное сетевое оборудование" level="2">
<node name="AMD" level="3">
<node name="Network Surge Protection" level="4"/>
</node>
</node>
</node>
<node name="AMP NETCONNECT" level="1">
<node name="Ноутбуки" level="2">
<node name="BOX" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
</node>
</node>
<node name="IBM" level="1">
<node name="Ноутбуки" level="2">
<node name="AMD" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
<node name="Intel" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
</node>
</node>
<node name="SIEMENS COMMUNICATIONS" level="1">
<node name="Телефония" level="2">
<node name="Телефонные станции" level="3">
<node name="Модули для телефонных станций" level="4"/>
</node>
</node>
</node>
</category>
<category name="BRAK">
<node name="ADOBE SYSTEMS" level="1">
<node name="Not defined" level="2">
<node name="BOX" level="3">
<node name="InfraStruXure Type A" level="4"/>
</node>
</node>
<node name="Активное сетевое оборудование" level="2">
<node name="Call Centre" level="3">
<node name="IP Телефония" level="4"/>
</node>
</node>
</node>
<node name="ALCATEL" level="1">
<node name="Активное сетевое оборудование" level="2">
<node name="AMD" level="3">
<node name="Network Surge Protection" level="4"/>
</node>
</node>
</node>
<node name="AMP NETCONNECT" level="1">
<node name="Ноутбуки" level="2">
<node name="BOX" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
</node>
</node>
<node name="IBM" level="1">
<node name="Ноутбуки" level="2">
<node name="AMD" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
<node name="Intel" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
</node>
</node>
<node name="SIEMENS COMMUNICATIONS" level="1">
<node name="Телефония" level="2">
<node name="Телефонные станции" level="3">
<node name="Модули для телефонных станций" level="4"/>
</node>
</node>
</node>
</category>
<category name="UNDEF">
<node name="ADOBE SYSTEMS" level="1">
<node name="Not defined" level="2">
<node name="BOX" level="3">
<node name="InfraStruXure Type A" level="4"/>
</node>
</node>
<node name="Активное сетевое оборудование" level="2">
<node name="Call Centre" level="3">
<node name="IP Телефония" level="4"/>
</node>
</node>
</node>
<node name="ALCATEL" level="1">
<node name="Активное сетевое оборудование" level="2">
<node name="AMD" level="3">
<node name="Network Surge Protection" level="4"/>
</node>
</node>
</node>
<node name="AMP NETCONNECT" level="1">
<node name="Ноутбуки" level="2">
<node name="BOX" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
</node>
</node>
<node name="IBM" level="1">
<node name="Ноутбуки" level="2">
<node name="AMD" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
<node name="Intel" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
</node>
</node>
<node name="SIEMENS COMMUNICATIONS" level="1">
<node name="Телефония" level="2">
<node name="Телефонные станции" level="3">
<node name="Модули для телефонных станций" level="4"/>
</node>
</node>
</node>
</category>
<category name="ALL">
<node name="ADOBE SYSTEMS" level="1">
<node name="Not defined" level="2">
<node name="BOX" level="3">
<node name="InfraStruXure Type A" level="4"/>
</node>
</node>
<node name="Активное сетевое оборудование" level="2">
<node name="Call Centre" level="3">
<node name="IP Телефония" level="4"/>
<data>
<line>
<MATNR>000000000000000701</MATNR>
<MATERIAL_TEXT> Тестовый материал 701</MATERIAL_TEXT>
<MFRPN>12345</MFRPN>
<CHARG/>
<MTART>ZHAW</MTART>
<MATKL>0270</MATKL>
<SOBKZ/>
<KZKFG/>
<STOCKRF>45</STOCKRF>
<STOCKRF_FREE>30</STOCKRF_FREE>
<TRANSIT>10</TRANSIT>
<TRANSIT_FREE>10</TRANSIT_FREE>
<STOCKRM>5</STOCKRM>
<STOCKRM_FREE>0</STOCKRM_FREE>
<ORDERED>20</ORDERED>
<ORDERED_FREE>20</ORDERED_FREE>
<MEINS>ST</MEINS>
<QUANTITY>0</QUANTITY>
<MEINH/>
<COL1>0.0</COL1>
<COL2>0.0</COL2>
<COL3>0.0</COL3>
<MOD_PRICE>0.0</MOD_PRICE>
<DISCOUNT>0.0</DISCOUNT>
<SUMM>0.0</SUMM>
<KONWA/>
<HAS_SCALE/>
<ZCOMMENT/>
</line>
</data>
</node>
</node>
</node>
<node name="ALCATEL" level="1">
<node name="Активное сетевое оборудование" level="2">
<node name="AMD" level="3">
<node name="Network Surge Protection" level="4"/>
</node>
</node>
</node>
<node name="AMP NETCONNECT" level="1">
<node name="Ноутбуки" level="2">
<node name="BOX" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
</node>
</node>
<node name="IBM" level="1">
<node name="Ноутбуки" level="2">
<node name="AMD" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
<node name="Intel" level="3">
<node name="Тонкие и легкие" level="4"/>
</node>
</node>
</node>
<node name="SIEMENS COMMUNICATIONS" level="1">
<node name="Телефония" level="2">
<node name="Телефонные станции" level="3">
<node name="Модули для телефонных станций" level="4"/>
</node>
</node>
</node>
</category>
</categories>
xslt преобразование в экселовсский формат.
Code:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sapxsl="http://www.sap.com/sapxsl" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html=
"http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>boger</Author>
<LastAuthor>Boger</LastAuthor>
<Created>2005-09-16T09:38:52Z</Created>
<LastSaved>2005-11-29T15:03:40Z</LastSaved>
<Company>Home</Company>
<Version>11.6360</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<Colors>
<Color>
<Index>39</Index>
<RGB>#E3E3E3</RGB>
</Color>
</Colors>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>6840</WindowHeight>
<WindowWidth>13170</WindowWidth>
<WindowTopX>0</WindowTopX>
<WindowTopY>0</WindowTopY>
<TabRatio>601</TabRatio>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font x:CharSet="204"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s23">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom" ss:WrapText="1"/>
<Font ss:Bold="1" x:CharSet="204" x:Family="Swiss"/>
</Style>
</Styles>
<xsl:apply-templates select="categories"/>
</Workbook>
</xsl:template>
<xsl:template match="categories">
<xsl:apply-templates select="category"/>
</xsl:template>
<xsl:template match="category">
<Worksheet xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" ss:Name="{@name}">
<Table ss:ExpandedColumnCount="22" ss:ExpandedRowCount="380" x:FullColumns="1" x:FullRows="1">
<Column ss:AutoFitWidth="0" ss:Width="51"/>
<Column ss:AutoFitWidth="0" ss:Width="41.25"/>
<Column ss:AutoFitWidth="0" ss:Width="55.5"/>
<Column ss:AutoFitWidth="0" ss:Index="5" ss:Width="62.25"/>
<Column ss:AutoFitWidth="0" ss:Width="191.25"/>
<Column ss:AutoFitWidth="0" ss:Width="130.5"/>
<Column ss:AutoFitWidth="0" ss:Width="56.25"/>
<Column ss:AutoFitWidth="0" ss:Width="40.5"/>
<Column ss:AutoFitWidth="0" ss:Width="51.75"/>
<Column ss:AutoFitWidth="0" ss:Width="66.75"/>
<Column ss:AutoFitWidth="0" ss:Index="13" ss:Width="65.25"/>
<Column ss:AutoFitWidth="0" ss:Span="1" ss:Width="59.25"/>
<Column ss:AutoFitWidth="0" ss:Index="16" ss:Width="47.25"/>
<Column ss:AutoFitWidth="0" ss:Width="52.5"/>
<Column ss:AutoFitWidth="0" ss:Width="36"/>
<Column ss:AutoFitWidth="0" ss:Index="22" ss:Width="197.25"/>
<Row>
<Cell>
<Data ss:Type="String">Дата выгрузки: 29.11.2005 17:07:55</Data>
</Cell>
</Row>
<Row ss:Height="38.25" ss:StyleID="s23">
<Cell ss:Index="5">
<Data ss:Type="String">Код материала</Data>
</Cell>
<Cell>
<Data ss:Type="String">Описание</Data>
</Cell>
<Cell>
<Data ss:Type="String">P/N</Data>
</Cell>
<Cell>
<Data ss:Type="String">Партия</Data>
</Cell>
<Cell>
<Data ss:Type="String">Склад</Data>
</Cell>
<Cell>
<Data ss:Type="String">Свободно на складе</Data>
</Cell>
<Cell>
<Data ss:Type="String">Ближний транзит</Data>
</Cell>
<Cell>
<Data ss:Type="String">Свободно в ближнем транзите</Data>
</Cell>
<Cell>
<Data ss:Type="String">Дальний транзит</Data>
</Cell>
<Cell>
<Data ss:Type="String">Свободно в дальнем транзите</Data>
</Cell>
<Cell>
<Data ss:Type="String">Заказ</Data>
</Cell>
<Cell>
<Data ss:Type="String">Свободно в заказе</Data>
</Cell>
<Cell>
<Data ss:Type="String">I</Data>
</Cell>
<Cell>
<Data ss:Type="String">II</Data>
</Cell>
<Cell>
<Data ss:Type="String">III</Data>
</Cell>
<Cell>
<Data ss:Type="String">Комментарий</Data>
</Cell>
</Row>
<xsl:apply-templates select="node"/>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Selected/>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</xsl:template>
<xsl:template match="node">
<Row xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Cell ss:Index="{@level}">
<Data ss:Type="String">
<xsl:value-of select="@name"/>
</Data>
</Cell>
</Row>
<xsl:apply-templates select="node"/>
<xsl:apply-templates select="data"/>
</xsl:template>
<xsl:template match="data">
<xsl:for-each select="*">
<Row xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Cell ss:Index="5">
<Data ss:Type="String">
<xsl:value-of select="MATNR"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="MATERIAL_TEXT"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="MFRPN"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="CHARG"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="STOCKRF"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="STOCKRF_FREE"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="TRANSIT"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="TRANSIT_FREE"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="STOCKRM"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="STOCKRM_FREE"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ORDERED"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ORDERED_FREE"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="COL1"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="COL2"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="COL3"/>
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ZCOMMENT"/>
</Data>
</Cell>
</Row>
</xsl:for-each>
</xsl:template>
</xsl:transform>
Пока заголовок экселовского файла никак не меняется, потом будут проставлятся реальные даты и имена.
Проблема с <Table ss:ExpandedColumnCount="22" ss:ExpandedRowCount="380" x:FullColumns="1" x:FullRows="1">
Нужно проставить количество использованных строк в _экселевской_ таблице. Заранее это число не известно и нужно сделать это из самой xslt'шки. Самый простой вариант посчитать кол-во элемента <row>, но это можно сделать только после формирования элемента <table>. кто-нибудь знает как это можно решить?