Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Экспорт из DB и группировка! / 6 сообщений из 6, страница 1 из 1
03.07.2008, 15:08
    #35409089
Andrew_New
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт из DB и группировка!
Всем привет! Есть такая задача, решить не могу никак. Имеется шаблон template.xsl
в него кидаю данные из баз СКЛ. все прекрасно работает, но вот никак не могу понять, как сделать группировку типа MergeDown в экселе.
template.xsl
Код: plaintext
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.
58.
59.
60.
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  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">
  <xsl:template match="/">
    <xsl:processing-instruction name="mso-application">
      <xsl:text>progid="Excel.Sheet"</xsl:text>
    </xsl:processing-instruction>
  <Workbook>
    <Styles>
      <Style ss:ID="Default" ss:Name="Normal">
        <Alignment ss:Vertical="Bottom"/>
        <Borders/>
        <Font ss:FontName="Arial Cyr" x:CharSet="204"/>
        <Interior/>
        <NumberFormat/>
        <Protection/>
      </Style>
    <Worksheet ss:Name="sheet 1">
      <Table x:FullColumns="1"
   x:FullRows="1">
        <Row ss:AutoFitHeight="0" ss:Height="13.5">
          <Cell ss:Index="2" ss:StyleID="s42">
            <Data ss:Type="String">SL#</Data>
          </Cell>
          <Cell ss:MergeAcross="1" ss:StyleID="m18876918">
            <Data ss:Type="String">SUPPLIER NAME</Data>
          </Cell>
          <Cell ss:StyleID="s51">
            <Data ss:Type="String">PACKAGES</Data>
          </Cell>
        </Row>
        <xsl:apply-templates select="//TestTable" />
     </Table>
    </Worksheet>
  </Workbook>
</xsl:template>

<xsl:template match="TestTable">
  <Row ss:AutoFitHeight="0" ss:Height="23.25">
    <Cell ss:Index="2" ss:StyleID="s82" ss:Formula="=ROW()-9">
      <Data ss:Type="Number"> 1 </Data>
    </Cell>
    <Cell ss:MergeAcross="1" ss:StyleID="m18876938">
      <Data ss:Type="String">
        <xsl:value-of select="SupplierName" />
      </Data>
    </Cell>
------------------------------------ 
вот тут нужно сделать объединение ячеек, если поле 'Packages' повторяется
  <Cell  ss:MergeDown="???" ss:StyleID="s71">
      <Data ss:Type="String">
        <xsl:value-of select="Packages" />
      </Data>
    </Cell>
------------------------------------
</Row>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
03.07.2008, 15:56
    #35409351
Volder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт из DB и группировка!
приведите часть XML входного - который Вы конвертите.

еще вопрос, а у этих разных 'Packages' значение одинаковое?
иначе, что Вы хотите в объединенную ячейку вставлять?

PS
так на вскидку функция count() в помощь.
...
Рейтинг: 0 / 0
03.07.2008, 16:21
    #35409467
Andrew_New
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт из DB и группировка!
Вот это идет на вход.

Код: plaintext
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.
<TestDataSet>
  <TestTable>
    <ID> 6 </ID>
    <SupplierName>SAF</SupplierName>
    <Packages> 1  x BOX</Packages>
  </TestTable>
  <TestTable>
    <ID> 1 </ID>
    <SupplierName>SAF</SupplierName>
    <Packages> 1  x BOX</Packages>
  </TestTable>
  <TestTable>
    <ID> 3 </ID>
    <SupplierName>SAFD</SupplierName>
    <Packages> 1  x BOX</Packages>
  </TestTable>
  <TestTable>
    <ID> 4 </ID>
    <SupplierName>SAF</SupplierName>
    <Packages> 11  x CARTONS IN ONE PALLETE &  2  BUNDLES</Packages>
  </TestTable>
  <TestTable>
    <ID> 5 </ID>
    <SupplierName>SAF</SupplierName>
    <Packages> 11  x CARTONS IN ONE PALLETE &  2  BUNDLES</Packages>
  </TestTable>
  <TestTable>
    <ID> 2 </ID>
    <SupplierName>SAFD</SupplierName>
    <Packages> 11  x CARTONS IN ONE PALLETE &  2  BUNDLES</Packages>
  </TestTable>
</TestDataSet>
...
Рейтинг: 0 / 0
03.07.2008, 17:57
    #35409810
Andrew_New
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт из DB и группировка!
Делаю так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  <xsl:for-each select="TestTable">
      <xsl:variable name="Packages" select="Packages"/>
      <xsl:if test="not(preceding-sibling::TestTable[Packages = $Packages])">
        <Cell ss:MergeDown="{count(../TestTable[Packages = $Packages])}" ss:StyleID="s71">
          <Data ss:Type="String">
            <xsl:value-of select="$Packages" />
          </Data>
        </Cell>
      </xsl:if>
    </xsl:for-each>

но не работает (( что не так?
...
Рейтинг: 0 / 0
03.07.2008, 18:04
    #35409842
Volder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт из DB и группировка!
для Вашего примера примените:
Код: plaintext
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.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/TestDataSet">
		<Table>
			<xsl:apply-templates select="TestTable">
				<xsl:sort select="Packages"/>
			</xsl:apply-templates>
		</Table>
	</xsl:template>
	<xsl:template match="TestTable">
		<xsl:variable name="Pack" select="Packages"/>
		<Row>
			<xsl:apply-templates mode="all"/>
			<xsl:if test="count(preceding::TestTable[Packages=$Pack])=0">
				<Cell MergeDown="{count(following::TestTable[Packages=$Pack])}">
					<xsl:value-of select="Packages"/>
				</Cell>
			</xsl:if>
		</Row>
	</xsl:template>
	<xsl:template match="*[not(self::Packages)]" mode="all">
		<Cell>
			<xsl:value-of select="."/>
		</Cell>
	</xsl:template>
	<xsl:template match="Packages" mode="all">
		<!--do nothing-->
	</xsl:template>
</xsl:stylesheet>
как переложить в XML структуры Excel надеюсь проблем не возникнет.
...
Рейтинг: 0 / 0
03.07.2008, 18:22
    #35409901
Andrew_New
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт из DB и группировка!
Volderдля Вашего примера примените:
Код: plaintext
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.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/TestDataSet">
		<Table>
			<xsl:apply-templates select="TestTable">
				<xsl:sort select="Packages"/>
			</xsl:apply-templates>
		</Table>
	</xsl:template>
	<xsl:template match="TestTable">
		<xsl:variable name="Pack" select="Packages"/>
		<Row>
			<xsl:apply-templates mode="all"/>
			<xsl:if test="count(preceding::TestTable[Packages=$Pack])=0">
				<Cell MergeDown="{count(following::TestTable[Packages=$Pack])}">
					<xsl:value-of select="Packages"/>
				</Cell>
			</xsl:if>
		</Row>
	</xsl:template>
	<xsl:template match="*[not(self::Packages)]" mode="all">
		<Cell>
			<xsl:value-of select="."/>
		</Cell>
	</xsl:template>
	<xsl:template match="Packages" mode="all">
		<!--do nothing-->
	</xsl:template>
</xsl:stylesheet>
как переложить в XML структуры Excel надеюсь проблем не возникнет.

Огромнейшее спасибо! Выручили!
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Экспорт из DB и группировка! / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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