|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
Добрый день! Примерно имеется следующий xml <positions> <position> <cost>10</cost> <amount>2</amount> </position> <position> <cost>20</cost> <amount>5</amount> </position> .... <positions> Возникла примерно такая задача - подсчитать общую сумму позиций по ключу cost с учетом кол-ва(amount) т.е. что то типа sum(count*amount). Мне кажется это можно как то эту задачу решить тривиально одной строчкой, а не использовать рекурсию. Или я все-таки ошибаюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2011, 21:10 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
nego, sum(//amount) ? А что подразумевается под count? А можешь покажешь свое творение с рекурсией, что бы не гадать - глядишь, подскажут как упростить... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2011, 21:53 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
Видимо я не правильно описал поставленную задачу.... Мне необходимо вычислить общую сумму предложений (positions), c учетом кол-ва указанного в в поле amount умноженного на его стоимость за единицу (cost). Т.е. доложно быть что то типа такого - sum(/positions/position/cost * /positions/position/amount) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 10:20 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
negoВидимо я не правильно описал поставленную задачу.... Если твой XSL-процессор, поддерживает XPath 2.0, то можно так: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 10:47 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
А на первой версии? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 10:49 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
nego, На 1-й без рекурсии вряд ли... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 10:51 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
Дело в том, что я использую xslt процессор в php5. А там поддерживается только 1-я версия. Чтобы использовать 2-ю версию, насколько я знаю, нужно использовать шаманские обертки для работы с процессором, написанном на Java. Как то не хочется. В голову мне пришла только одна идея - добавить новый node типа total при помощи ф-ции <xsl:copy>. Вот тут у меня появляется вопрос понимания, как я могу дальше работать с результатом. Насколько я понимаю у меня на выходе будет вновь сформированный xml, на который я опять должен заново накладывать новый шаблон при помощи функций пхп? Т.е. сначала в пхп я пишу код наложения xml на xslt, который формирует на выходе новый xml и на него я уже опять в php накладываю новый шаблон для вывода суммы по полю total. Или же можно как то в одном шаблоне (не выходя из обработки) сразу же после добавления нового поля total уже пройтись шаблоном для вывода суммы по полю total. Т.е. в php будет только одно наложение шаблона на xml, а весь цикл преобразования (а точнее добавления нового поля total) и вывода уже суммы по полю total будет описан в одном шаблоне? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 17:16 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
Вот думаю примерно сделать так: <?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> Но что то не фурычит.... видимо совсем фигню накатал...Но идея может быть правильная или же я не прав вообще? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 17:35 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 19:37 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
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> но что то у меня не выходит работа с этой переменной.. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 20:01 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
nego, <xsl:variable name="myTotal" select="xalan:nodeset($tmpTotal)"/> Привязка к конкретному процессору. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 20:14 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
refreg, Ага, спасибо... значит если у меня используется процессор пхп - xmlns:php=" http://php.net/xsl", то что то наподобие <xsl:variable name="myTotal" select="php:nodeset($tmpTotal)"/> должно быть написано, т.е. нужно поискать есть ли поддержка команды nodesetв процеесоре пхп. А вообще можно ли теоретически налету перестраивать xml в xslt и там же (в xslt) уже работать с новой структурой? Еще раз СПАСИБО большое за помощь... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 20:23 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
negorefreg, Ага, спасибо... значит если у меня используется процессор пхп - xmlns:php=" http://php.net/xsl", то что то наподобие <xsl:variable name="myTotal" select="php:nodeset($tmpTotal)"/> должно быть написано, т.е. нужно поискать есть ли поддержка команды nodesetв процеесоре пхп.Удачи... negoА вообще можно ли теоретически налету перестраивать xml в xslt и там же (в xslt) уже работать с новой структурой? Еще раз СПАСИБО большое за помощь... Сумбурный вопрос. Ответ скорее - нет, так нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 20:32 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
negoНо дело том, что в дальнейшем мне нужно будет вычислять TotalSum по отдельным позициям - где эти позиции я буду выбирать указывая условия в XPath. Поэтому я и думал всунуть на лету отдельный элемент total, чтобы потом я мог делать суммирование не только по всему дереву но и по отдельным элементам. Почему ты думаешь, что тут ничего не сделаешь классическими методами. Пример необычного XML в студию! (Желательно, с попыткой решения) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 20:41 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
Спасибо, решил задачу классическим методом. Просто кода стало чуть больше да и когда нужно высчитывать сумму для множества разных условий, то мне кажется это занимает больше времени, чем если бы можно( а я думаю все таки как то можно, просто пока опыта пока нет) засунуть "переделанный" xml в переменную и там уже с ним работать используя XPath'ы. Еще раз спасибо за участие. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 10:51 |
|
Вычисление сумм - цена умножить на кол-во
|
|||
---|---|---|---|
#18+
negoа я думаю все таки как то можноВ XPath 2.0 появилось понятие список, убрано понятие набор узлов - посмотри на 4 пост - куда элегантнее? И, главное, это - стандарт, а не извращения процессороделателей. Почему-то он активно отвергается, и не используется... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2011, 11:18 |
|
|
start [/forum/topic.php?fid=14&msg=37338013&tid=1332916]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
83ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 180ms |
0 / 0 |