Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Найти максимум в XML по 2м атрибутам / 6 сообщений из 6, страница 1 из 1
27.05.2010, 15:44
    #36653280
kryll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в XML по 2м атрибутам
Привет

Столкнулся с такой задачей в XML нужно с пом. XSLT найти максимальное значение суммы атрибутов в пределах одного тега. Например нужно найти максимум по сумме атрибутов a и b

<root>
<tag a="1" b="1"/>
<tag a="10" b="2"/>
<tag a="8" b="8"/>
<tag a="2" b="10"/>
</root>

В данном случае максимум будет 16 = 8 + 8, т.е. 3я строка.
Мне нужно чтобы это значение сохранялось в xsl:variable. Подскажите как этого можно добиться.

Заранее спасибо!
...
Рейтинг: 0 / 0
27.05.2010, 17:13
    #36653560
junb1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в XML по 2м атрибутам
Код: 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.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="curval"/>
<xsl:template match="/">

	<xsl:variable name="findmaxpos">
		<xsl:variable name="pp1" select="root/tag[position()=1]/@a+root/tag[position()=1]/@b"/>
		<xsl:variable name="cnt" select="count(root/tag)"/>
		<xsl:call-template name="comp">
			<xsl:with-param name="p1" select="$pp1"/>
			<xsl:with-param name="maxpos" select="1"/>
			<xsl:with-param name="pos" select="2"/>
			<xsl:with-param name="cnt" select="$cnt"/>
		</xsl:call-template>
	</xsl:variable>
	
	<xsl:value-of select="$findmaxpos"/>
</xsl:template>
	
<xsl:template name="comp">
	<xsl:param name="p1"/>
	<xsl:param name="maxpos"/>
	<xsl:param name="pos"/>
	<xsl:param name="cnt"/>
	
	<xsl:if test="not($pos>$cnt)">
		<xsl:variable name="pp1" select="root/tag[position()=$pos]/@a+root/tag[position()=$pos]/@b"/>
		<xsl:if test="$pp1>$p1">
			<xsl:call-template name="comp">
				<xsl:with-param name="p1" select="$pp1"/>
				<xsl:with-param name="maxpos" select="$pos"/>
				<xsl:with-param name="pos" select="$pos+1"/>
				<xsl:with-param name="cnt" select="$cnt"/>
			</xsl:call-template>
		</xsl:if>
		<xsl:if test="not($pp1>$p1)">
			<xsl:call-template name="comp">
				<xsl:with-param name="p1" select="$p1"/>
				<xsl:with-param name="maxpos" select="$maxpos"/>
				<xsl:with-param name="pos" select="$pos+1"/>
				<xsl:with-param name="cnt" select="$cnt"/>
			</xsl:call-template>
		</xsl:if>
	</xsl:if>
	<xsl:if test="$pos>$cnt">
		<xsl:value-of select="$maxpos"/>
	</xsl:if>
</xsl:template>
	
</xsl:stylesheet>

я не сильно старался уменьшить количество кода.. сам уже постараешься :)
...
Рейтинг: 0 / 0
28.05.2010, 10:49
    #36654818
kryll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в XML по 2м атрибутам
junb1,

Спасибо большое!
...
Рейтинг: 0 / 0
14.06.2010, 13:25
    #36685759
аноним123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в XML по 2м атрибутам
и где тут сохранение в Variable?
...
Рейтинг: 0 / 0
15.06.2010, 11:45
    #36687252
junb1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в XML по 2м атрибутам
еще бы понять что вам не понятно )))
...
Рейтинг: 0 / 0
23.06.2010, 06:16
    #36702057
y-niko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в XML по 2м атрибутам
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	
	<xsl:template match="root">
		<xsl:for-each select="tag">
			<xsl:sort select="attribute::a+attribute::b" data-type="number" order="descending"/>
			<xsl:if test="position()=1">
				<xsl:variable name="max_value" select="."/>
				<!--
				Max: <xsl:value-of select="attribute::a+attribute::b"/>
				-->
			</xsl:if>
			<xsl:if test="position()=last()">
				<xsl:variable name="min_value" select="."/>
				<!--
				Min: <xsl:value-of select="attribute::a+attribute::b"/>
				-->
			</xsl:if>
		</xsl:for-each>
	</xsl:template>
	
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Найти максимум в XML по 2м атрибутам / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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