powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Найти максимум в XML по 2м атрибутам
6 сообщений из 6, страница 1 из 1
Найти максимум в XML по 2м атрибутам
    #36653280
kryll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет

Столкнулся с такой задачей в 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
Найти максимум в XML по 2м атрибутам
    #36653560
junb1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Найти максимум в XML по 2м атрибутам
    #36654818
kryll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
junb1,

Спасибо большое!
...
Рейтинг: 0 / 0
Найти максимум в XML по 2м атрибутам
    #36685759
аноним123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и где тут сохранение в Variable?
...
Рейтинг: 0 / 0
Найти максимум в XML по 2м атрибутам
    #36687252
junb1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще бы понять что вам не понятно )))
...
Рейтинг: 0 / 0
Найти максимум в XML по 2м атрибутам
    #36702057
y-niko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Найти максимум в XML по 2м атрибутам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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