2013-04-24 2 views
0

Рассмотрим файл XML определяется как:Невозможно выполнить умножение с XQuery в Basex

<?xml version="1.0"?> 
<sports> 
    <teams> 
    <team tno="t100"> 
      <tname>Knights</tname> 
      <city>London</city> 
     </team> 
     <team tno="t200"> 
      <tname>Dukes</tname> 
      <city>Surrey</city> 
     </team> 
     <team tno="t300"> 
      <tname>Kings</tname> 
      <city>Leeds</city> 
     </team>  
    </teams> 

    <players> 
    <player pid="p501"> 
      <pname>Simon</pname> 
      <city>London</city> 
     </player> 
     <player pid="p502"> 
      <pname>Andrew</pname> 
      <city>Birmingham</city> 
     </player> 
     <player pid="p503"> 
      <pname>Mike</pname> 
      <city>London</city> 
     </player>  
    </players> 


    <parts> 
     <part pno="801">    
      <pname>Right Gloves</pname> 
      <price>8.99</price> 
     </part> 
     <part pno="901">    
      <pname>Left Gloves</pname> 
      <price>9.99</price> 
     </part> 
     <part pno="851">    
      <pname>Left Pad</pname> 
      <price>33.00</price> 
     </part> 
     <part pno="951">    
      <pname>Right Pad</pname> 
      <price>43.00</price> 
     </part> 
    </parts> 

    <orders>  
     <order ono="61" playerNum="p501" team="t200" > 
      <kits> 
       <kit> 
        <pNum>801</pNum> 
        <qty>11</qty> 
       </kit> 
      </kits> 
     </order> 
     <order ono="62" playerNum="p501" team="t100" > 
      <kits> 
       <kit> 
        <pNum>901</pNum> 
        <qty>12</qty> 
       </kit> 

      </kits> 
     </order> 

     <order ono="63" playerNum="p502" team="t300" > 
      <kits> 
       <kit> 
        <pNum>851</pNum> 
        <qty>9</qty> 
       </kit> 

      </kits> 
     </order> 

     <order ono="64" playerNum="p503" team="t300" > 
      <kits> 
       <kit> 
        <pNum>951</pNum> 
        <qty>16</qty> 
       </kit> 

      </kits> 
     </order> 


     <order ono="65" playerNum="p503" team="t200" > 
      <kits> 
       <kit> 
        <pNum>801</pNum> 
        <qty>12</qty> 
       </kit> 
       <kit> 
        <pNum>901</pNum> 
        <qty>16</qty> 
       </kit> 
       <kit> 
        <pNum>851</pNum> 
        <qty>13</qty> 
       </kit> 
      </kits> 
     </order> 

    </orders> 
</sports> 

запрос, который я пытаюсь запустить, чтобы получить общую оценку для определенного порядка (скажем, порядка 65). Запрос в Basex является:

let $d:=doc("sports.xml") 
let $o:=$d/sports/orders/order[@ono=65] 
let $p:=$d/sports/parts/part 
for $k in $o/kits/kit 
return <OrderCost> 
({$k/qty})*({$p[@pno=$k/pNum]/price}) 
</OrderCost> 

Мой выход:

<OrderCost> 
(<qty>12</qty>)*(<price>8.99</price>) 
</OrderCost> 
<OrderCost> 
(<qty>16</qty>)*(<price>9.99</price>) 
</OrderCost> 
<OrderCost> 
(<qty>13</qty>)*(<price>33.00</price>) 
</OrderCost> 

Я не могу умножить количество с соответствующей ценой, а затем получить сумму. Что я здесь делаю неправильно?

ответ

2

При создании элементов оценивается все внутри фигурных скобок (и не оценивается ни одна внешняя фигурная скобка). Поскольку вы только привязываете фигурные скобки вокруг своих переменных, их заменяют только, но умножение не выполняется.

Заменить на этой линии:

{ $k/qty * $p[@pno=$k/pNum]/price } 
+0

Спасибо Jens, который работал. Однако существует ли такое ограничение для функции sum(). Когда я изменяю свой код, чтобы получить сумму всех цен, вместо суммы всего элемента «сумма» печатается. – xs2dhillon

+0

Вот модифицированный код: ** let $ d: = doc ("sports.xml") let $ o: = $ d/sports/orders/order [@ ono = 65] let $ p: = $ d/спорт/части/часть за $ к в $ O/комплекты/комплект возврата сумму ({$ к/кол-во * $ р [@ ПНО = $ к/pNum] цена /}) ** и ниже о/р: ** сумма (107,88) сумма (159,84) сумма (429) ** – xs2dhillon

+0

Как вы хотите, чтобы 'sum()' оценивалась, она также должна быть в фигурных скобках. –

Смежные вопросы