Добавление значений в кумулятивном формате

У меня есть структура xml следующим образом:

<bookstore>
  <book>
    <name>story</name>
    <price>50.00</price>
    <author>smith</smith>
  </book>
  <book>
    <name>history</name>
    <price>150.00</price>
    <author>kelly</smith>
  </book>
  <book>
    <name>epic</name>
    <price>300.00</price>
    <author>jones</smith>
  </book>
</bookstore>

В приведенном выше примере я хочу добавить цену следующим образом:

цена первой книги должна быть возвращена как есть. Цена второй книги должна быть добавлена ​​к цене первой книги 50.00+150=200.00 Цена третьей книги должна быть добавлена ​​к цене первой и второй книги 50.00+150.00+300.00=500.00

& вернуть значения цены, как показано ниже

<pricelist>
  <price>50.00</price>
  <price>200.00</price>
  <price>500.00</price>
</pricelist>

может ли кто-нибудь помочь мне в этом??

Спасибо.


person Sofia    schedule 30.12.2014    source источник
comment
Таблица стилей XSLT может решить вашу проблему   -  person Krunal Patil    schedule 30.12.2014


Ответы (1)


Есть два способа решить вашу проблему. Можно было бы суммировать все предыдущие одноуровневые книги, которые легко читать и кодировать, но имеют O(n^2) сложность и поэтому плохо масштабируются для больших входных данных, но подойдут для довольно небольших наборов (сложность может быть даже хуже, в зависимости от того, как ваш процессор XQuery разрешает предыдущие одноуровневые элементы).

for $book in /bookstore/book
return
  <price>{ sum(($book/price, $book/preceding-sibling::book/price)) }</price>

Как язык декларативного программирования, в XQuery отсутствуют переменные (которые можно изменять, например, в цикле). В качестве альтернативы напишите рекурсивную функцию, которая вычисляет сумму в O(n).

declare function local:sum($books, $sum) {
  if ($books) then
    let $price := $sum + $books[1]/price
    return
      (
        <price>{ $price }</price>,
        local:sum($books[position() > 1], $price)
      )
     else
       ()
};

local:sum(/bookstore/book, 0)
person Jens Erat    schedule 30.12.2014
comment
спасибо, я применил оба варианта, и предыдущий брат отлично работает в этом сценарии. - person Sofia; 30.12.2014