Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Не могу создать нужный xslt. Подскажите гуру / 6 сообщений из 6, страница 1 из 1
19.04.2012, 20:41
    #37761901
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу создать нужный xslt. Подскажите гуру
Есть таблица продаж:
TblSalesID DT SaleSum1 2012-04-10 1002 2012-04-15 50

и есть список проданных товаров, соответствующий для каждой продажи:
TblSaleGoodsListID Sale_ID Good_ID GoodCost1 1 10 202 1 11 603 1 13 204 2 10 305 2 13 20
где Good_ID идентификатор товара

также есть список получателей, куда были переданы эти товары.
TblSaleCustomersID Sale_ID Customer_ID1 1 12 1 23 2 2

При этом одна продажа может состоять из нескольких товаров.
И после продажи может быть передана нескольким получателям.

мне нужно из такого запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
	s.ID AS "@SaleID",
	CONVERT(varchar,s.DT,104) AS "@SaleDT",
	s.SaleSum AS "@SaleSum",
	
	gl.Good_ID AS "@Good_ID",
	gl.GoodCost AS "@GoodCost",
	
	sc.Customer_ID
FROM
	TblSales s INNER JOIN
	TblSaleGoodsList gl ON gl.Sale_ID=s.ID INNER JOIN
	TblSaleCustomers sc ON sc.Sale_ID=s.ID
FOR XML PATH(N'sale'), ROOT(N'sales')



вывести html такого вида:
Код: html
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.
<table border="1" style="width:500px;">
	<tr>
		<td>Sale DT:</td>
		<td>10.04.2012</td>
	</tr>
	<tr>
		<td>Sale sum:</td>
		<td>100</td>
	</tr>
	<tr>
		<td colspan="2">
			<table id="goodslist">
				<tr>
					<td>Good_ID</td>
					<td>Good cost</td>
				</tr>
				<tr>
					...
					...
					...
				</tr>
			</table>
		</td>
	</tr>
	<tr>
		<td colspan="2">
			<table id="customerslist">
				<tr>
					<td>Customer_ID</td>
				</tr>
				<tr>
					...
					...
					...
				</tr>
			</table>
		</td>
	</tr>
</table>



Где вместо точек будет список товаров, связанных с конкретной продажей.
Т.е. одним xslt шаблоном создать вышеуказанный html, используя вышеуказанный xml.
Единственный вариант, к-ый приходит на ум, только генерация отдельных таблиц из таблицы продаж и из таблицы получателей, затем генерация html продажи и склейка трех сгенерированных html'ов. Но такой вариант, "эстетически", не устраивает.

Есть ли возможность одним XSLT-шаблоном сгенерировать такой html?
Подскажите гуру.

Спасибо.
...
Рейтинг: 0 / 0
19.04.2012, 23:17
    #37762097
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу создать нужный xslt. Подскажите гуру
orunbekЕсть ли возможность одним XSLT-шаблоном сгенерировать такой html?Сложно сказать. XSLT, по своей природе, применяется не к SQL, а к XML. А XML здесь не приведен
...
Рейтинг: 0 / 0
20.04.2012, 06:16
    #37762224
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу создать нужный xslt. Подскажите гуру
_Vasilisk_,

Вы правы, я не привел Xml. Вот Xml, который можно получить из вышеуказанного запроса:
Код: xml
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.
<sales>
  <sale SaleID="1" SaleDT="10.04.2012" SaleSum="100.0000" Good_ID="10" GoodCost="20.0000">
    <Customer_ID>1</Customer_ID>
  </sale>
  <sale SaleID="1" SaleDT="10.04.2012" SaleSum="100.0000" Good_ID="11" GoodCost="60.0000">
    <Customer_ID>1</Customer_ID>
  </sale>
  <sale SaleID="1" SaleDT="10.04.2012" SaleSum="100.0000" Good_ID="13" GoodCost="20.0000">
    <Customer_ID>1</Customer_ID>
  </sale>
  <sale SaleID="1" SaleDT="10.04.2012" SaleSum="100.0000" Good_ID="10" GoodCost="20.0000">
    <Customer_ID>2</Customer_ID>
  </sale>
  <sale SaleID="1" SaleDT="10.04.2012" SaleSum="100.0000" Good_ID="11" GoodCost="60.0000">
    <Customer_ID>2</Customer_ID>
  </sale>
  <sale SaleID="1" SaleDT="10.04.2012" SaleSum="100.0000" Good_ID="13" GoodCost="20.0000">
    <Customer_ID>2</Customer_ID>
  </sale>
  <sale SaleID="2" SaleDT="15.04.2012" SaleSum="50.0000" Good_ID="10" GoodCost="30.0000">
    <Customer_ID>2</Customer_ID>
  </sale>
  <sale SaleID="2" SaleDT="15.04.2012" SaleSum="50.0000" Good_ID="13" GoodCost="20.0000">
    <Customer_ID>2</Customer_ID>
  </sale>
</sales>



и из него нужно получить такой html:
Код: html
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.
<table border="1" style="width:500px;">
	<tr>
		<td>Sale DT:</td>
		<td>10.04.2012</td>
	</tr>
	<tr>
		<td>Sale sum:</td>
		<td>100</td>
	</tr>
	<tr>
		<td colspan="2">
			<table id="goodslist">
				<tr>
					<td>Good_ID</td>
					<td>Good cost</td>
				</tr>
				<tr>
					...
					...
					...
				</tr>
			</table>
		</td>
	</tr>
	<tr>
		<td colspan="2">
			<table id="customerslist">
				<tr>
					<td>Customer_ID</td>
				</tr>
				<tr>
					...
					...
					...
				</tr>
			</table>
		</td>
	</tr>
</table>
...
Рейтинг: 0 / 0
20.04.2012, 10:47
    #37762471
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу создать нужный xslt. Подскажите гуру
orunbek,

оно? я просто не уверен, что правильно гадаю над нехваткой инфы
Код: xml
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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="dates" match="/sales/sale" use="@SaleDT" />
<xsl:key name="cfd" match="/sales/sale" use="concat( Customer_ID, @SaleDT)" />
<xsl:template match="/">
	<html>
	<head>
		<title>price</title>
	</head>
	<body>
		<xsl:for-each select="/sales/sale[ generate-id()=generate-id(key( 'dates', @SaleDT ))]">
            <xsl:sort order="descending" select="concat( substring-after( substring-after( @SateDT, '.' ), '.' ), substring-before( substring-after( @SateDT, '.' ),'.' ), substring-after( @SateDT, '.' ))" />
            <table border="1" style="width:500px;">
                <tr>
                    <td>
                        Sale DT:
                    </td>
                    <td>
                        <xsl:value-of select="@SaleDT" />
                    </td>
                </tr>
                <tr>
                    <td>
                        Sale sum:
                    </td>
                    <td>
                        <xsl:value-of select="@SaleSum" />
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <table id="goodslist">
                            <tr>
                                <td>Good_ID</td>
                                <td>Good cost</td>
                            </tr>
                            <xsl:for-each select="key( 'dates', current()/@SaleDT )">
                                <xsl:sort select="@Good_ID" />
                                <tr>
                                    <td>
                                        <xsl:value-of select="@Good_ID" />
                                    </td>
                                    <td>
                                        <xsl:value-of select="@GoodCost" />
                                    </td>
                                </tr>
                            </xsl:for-each>
                        </table>
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <table id="customerslist">
                            <tr>
                                <td>Customer_ID</td>
                            </tr>
                            <xsl:for-each select="/sales/sale[ generate-id()=generate-id(key( 'cfd', concat( Customer_ID, current()/@SaleDT )))]">
                                <xsl:sort select="Customer_ID" />
                                <tr>
                                    <td>
                                        <xsl:value-of select="Customer_ID" />
                                    </td>
                                </tr>
                            </xsl:for-each>
                        </table>
                    </td>
                </tr>
            </table>
            <br/>
        </xsl:for-each>
	</body>
	</html>
</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
20.04.2012, 10:55
    #37762486
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу создать нужный xslt. Подскажите гуру
в строке сортировки по дате ошибка, правильная выглядит так:
Код: xml
1.
<xsl:sort order="descending" select="concat( substring-after( substring-after( @SateDT, '.' ), '.' ), substring-before( substring-after( @SateDT, '.' ),'.' ), substring-before( @SateDT, '.' ))" />
...
Рейтинг: 0 / 0
02.05.2012, 08:24
    #37778584
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу создать нужный xslt. Подскажите гуру
Всем спасибо, извиняюсь за то что "пропал", много нового узнал про возможности группировки xml
Но задачу решил чуть другим способом, переделал сам SQL-запрос, который формировал xml, вдруг кому понадобится:
Код: sql
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.
SELECT
	s.ID AS "@SaleID",
	CONVERT(varchar,s.DT,104) AS "@SaleDT",
	s.SaleSum AS "@SaleSum",
	(
		SELECT
			gl.Good_ID AS "@Good_ID",
			gl.GoodCost AS "@GoodCost"
		FROM
			TblSaleGoodsList gl
		WHERE
			gl.Sale_ID=s.ID
		FOR XML PATH(N'goods'), ROOT(N'goodslist'), type
	),
	(
		SELECT
			sc.Customer_ID AS "@Customer_ID"
		FROM
			TblSaleCustomers sc
		WHERE
			sc.Sale_ID=s.ID
		FOR XML PATH(N'customer'), ROOT(N'customers'), type
	)
FROM
	TblSales s
FOR XML PATH(N'sale'), ROOT(N'sales')
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Не могу создать нужный xslt. Подскажите гуру / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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