powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Не могу создать нужный xslt. Подскажите гуру
6 сообщений из 6, страница 1 из 1
Не могу создать нужный xslt. Подскажите гуру
    #37761901
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица продаж:
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
Не могу создать нужный xslt. Подскажите гуру
    #37762097
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekЕсть ли возможность одним XSLT-шаблоном сгенерировать такой html?Сложно сказать. XSLT, по своей природе, применяется не к SQL, а к XML. А XML здесь не приведен
...
Рейтинг: 0 / 0
Не могу создать нужный xslt. Подскажите гуру
    #37762224
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Не могу создать нужный xslt. Подскажите гуру
    #37762471
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Не могу создать нужный xslt. Подскажите гуру
    #37762486
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в строке сортировки по дате ошибка, правильная выглядит так:
Код: xml
1.
<xsl:sort order="descending" select="concat( substring-after( substring-after( @SateDT, '.' ), '.' ), substring-before( substring-after( @SateDT, '.' ),'.' ), substring-before( @SateDT, '.' ))" />
...
Рейтинг: 0 / 0
Не могу создать нужный xslt. Подскажите гуру
    #37778584
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, извиняюсь за то что "пропал", много нового узнал про возможности группировки 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
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Не могу создать нужный xslt. Подскажите гуру
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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