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

Примерно имеется следующий xml
<positions>
<position>
<cost>10</cost>
<amount>2</amount>
</position>
<position>
<cost>20</cost>
<amount>5</amount>
</position>
....
<positions>

Возникла примерно такая задача - подсчитать общую сумму позиций по ключу cost с учетом кол-ва(amount) т.е. что то типа sum(count*amount).
Мне кажется это можно как то эту задачу решить тривиально одной строчкой, а не использовать рекурсию. Или я все-таки ошибаюсь?
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37338013
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nego,

sum(//amount) ? А что подразумевается под count? А можешь покажешь свое творение с рекурсией, что бы не гадать - глядишь, подскажут как упростить...
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37338596
nego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо я не правильно описал поставленную задачу....
Мне необходимо вычислить общую сумму предложений (positions), c учетом кол-ва указанного в в поле amount умноженного на его стоимость за единицу (cost). Т.е. доложно быть что то типа такого - sum(/positions/position/cost * /positions/position/amount)
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37338643
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
negoВидимо я не правильно описал поставленную задачу....

Если твой XSL-процессор, поддерживает XPath 2.0, то можно так:
Код: plaintext
<xsl:value-of select="sum(for $x in /positions/position return $x/cost*$x/amount)"/>
ссылочка
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37338648
nego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А на первой версии?
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37338651
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nego,

На 1-й без рекурсии вряд ли...
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37339773
nego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том, что я использую xslt процессор в php5. А там поддерживается только 1-я версия. Чтобы использовать 2-ю версию, насколько я знаю, нужно использовать шаманские обертки для работы с процессором, написанном на Java. Как то не хочется.
В голову мне пришла только одна идея - добавить новый node типа total при помощи ф-ции <xsl:copy>.
Вот тут у меня появляется вопрос понимания, как я могу дальше работать с результатом. Насколько я понимаю у меня на выходе будет вновь сформированный xml, на который я опять должен заново накладывать новый шаблон при помощи функций пхп? Т.е.
сначала в пхп я пишу код наложения xml на xslt, который формирует на выходе новый xml и на него я уже опять в php накладываю новый шаблон для вывода суммы по полю total. Или же можно как то в одном шаблоне (не выходя из обработки) сразу же после добавления нового поля total уже пройтись шаблоном для вывода суммы по полю total. Т.е. в php будет только одно наложение шаблона на xml, а весь цикл преобразования (а точнее добавления нового поля total) и вывода уже суммы по полю total будет описан в одном шаблоне?
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37339828
nego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот думаю примерно сделать так:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform" xmlns:php=" http://php.net/xsl">
<xsl:output method="html" indent="no"/>
<xsl:variable name="tmpXML">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/positions/position">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<total>
<xsl:value-of select="cost * amount"/>
</total>
</xsl:copy>
</xsl:template>
</xsl:variable>

<xsl:template match="/">
<xsl:value-of select="sum($tmpXML/positions/position/total)" />
</xsl:template>

</xsl:stylesheet>

Но что то не фурычит.... видимо совсем фигню накатал...Но идея может быть правильная или же я не прав вообще?
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37340088
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" version="1.0">
	<xsl:output method="html" indent="no"/>
	<!-- -->
	<xsl:template match="/">
		<xsl:call-template name="sum_position">
			<xsl:with-param name="s" select="0"/>
			<xsl:with-param name="nd" select="//position"/>
			<xsl:with-param name="k" select="1"/>
		</xsl:call-template>
	</xsl:template>
	<!-- -->
	<xsl:template name="sum_position">
		<xsl:param name="s" select="0"/>
		<xsl:param name="nd"/>
		<xsl:param name="k" select="0"/>
		<xsl:choose>
			<xsl:when test="$nd[$k]">
				<xsl:call-template name="sum_position">
					<xsl:with-param name="s" select="$s + $nd[$k]/cost * $nd[$k]/amount"/>
					<xsl:with-param name="nd" select="$nd"/>
					<xsl:with-param name="k" select="$k+1"/>
				</xsl:call-template>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$s"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	<!-- -->
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37340111
nego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg, спасибо большое за такое решение и мучение со мной!
Но дело том, что в дальнейшем мне нужно будет вычислять TotalSum по отдельным позициям - где эти позиции я буду выбирать указывая условия в XPath. Поэтому я и думал всунуть на лету отдельный элемент total, чтобы потом я мог делать суммирование не только по всему дереву но и по отдельным элементам. Неужели нельзя создать переменную tmpXML с которой потом можно будет работать... Эту идею я украл отсюда ссылка
Или же пример оттуда:
XML:
<Order>
<OrderLine>
<Quantity>
<Amount>2</Amount>
</Quantity>
<Price>
<UnitPrice>25</UnitPrice>
</Price>
</OrderLine>
<OrderLine>
<Quantity>
<Amount>10</Amount>
</Quantity>
<Price>
<UnitPrice>2</UnitPrice>
</Price>
</OrderLine>
<OrderLine>
<Quantity>
<Amount>23</Amount>
</Quantity>
<Price>
<UnitPrice>6</UnitPrice>
</Price>
</OrderLine>
</Order>

XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"
xmlns:xalan=" http://xml.apache.org/xalan">

<xsl:template match="/Order">
<root>
<xsl:variable name="tmpTotal">
<total_amount>
<xsl:for-each select="OrderLine">
<item>
<xsl:value-of select="Quantity/Amount * Price/UnitPrice"/>
</item>
</xsl:for-each>
</total_amount>
</xsl:variable>
<total>
<xsl:variable name="myTotal" select="xalan:nodeset($tmpTotal)"/>
<xsl:value-of select="sum($myTotal/total_amount/item)" />
</total>
</root>
</xsl:template>
</xsl:stylesheet>

но что то у меня не выходит работа с этой переменной..
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37340123
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nego,

<xsl:variable name="myTotal" select="xalan:nodeset($tmpTotal)"/>

Привязка к конкретному процессору.
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37340129
nego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg,
Ага, спасибо... значит если у меня используется процессор пхп - xmlns:php=" http://php.net/xsl", то что то наподобие <xsl:variable name="myTotal" select="php:nodeset($tmpTotal)"/> должно быть написано, т.е. нужно поискать есть ли поддержка команды nodesetв процеесоре пхп. А вообще можно ли теоретически налету перестраивать xml в xslt и там же (в xslt) уже работать с новой структурой?
Еще раз СПАСИБО большое за помощь...
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37340135
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
negorefreg,
Ага, спасибо... значит если у меня используется процессор пхп - xmlns:php=" http://php.net/xsl", то что то наподобие <xsl:variable name="myTotal" select="php:nodeset($tmpTotal)"/> должно быть написано, т.е. нужно поискать есть ли поддержка команды nodesetв процеесоре пхп.Удачи... negoА вообще можно ли теоретически налету перестраивать xml в xslt и там же (в xslt) уже работать с новой структурой?
Еще раз СПАСИБО большое за помощь... Сумбурный вопрос. Ответ скорее - нет, так нельзя.
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37340140
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
negoНо дело том, что в дальнейшем мне нужно будет вычислять TotalSum по отдельным позициям - где эти позиции я буду выбирать указывая условия в XPath. Поэтому я и думал всунуть на лету отдельный элемент total, чтобы потом я мог делать суммирование не только по всему дереву но и по отдельным элементам. Почему ты думаешь, что тут ничего не сделаешь классическими методами. Пример необычного XML в студию! (Желательно, с попыткой решения)
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37340705
nego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, решил задачу классическим методом. Просто кода стало чуть больше да и когда нужно высчитывать сумму для множества разных условий, то мне кажется это занимает больше времени, чем если бы можно( а я думаю все таки как то можно, просто пока опыта пока нет) засунуть "переделанный" xml в переменную и там уже с ним работать используя XPath'ы. Еще раз спасибо за участие.
...
Рейтинг: 0 / 0
Вычисление сумм - цена умножить на кол-во
    #37340776
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
negoа я думаю все таки как то можноВ XPath 2.0 появилось понятие список, убрано понятие набор узлов - посмотри на 4 пост - куда элегантнее? И, главное, это - стандарт, а не извращения процессороделателей. Почему-то он активно отвергается, и не используется...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Вычисление сумм - цена умножить на кол-во
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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