2013-04-24 49 views
0

使用XQuery執行乘法考慮一個XML文件定義爲:無法在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

由於延,即工作。然而,'sum()'函數也有這樣的約束。當我修改我的代碼以獲得所有價格的總和時,而不是所有項目的總和時,會打印「總和」。 – xs2dhillon 2013-04-24 12:41:08

+0

這是修改的代碼:** let $ d:= doc(「sports.xml」) let $ o:= $ d/sports/orders/order [@ ono = 65] let $ p:= $ d /運動/零件/部件 for $ k in $ o/kit/kit return sum({$ k/qty * $ p [@ pno = $ k/pNum]/price}) **以下是的O/p:** 總和(107.88) 總和(159.84) 總和(429) ** – xs2dhillon 2013-04-24 12:42:03

+0

正如你想'sum()'得到評估一樣,它也必須在大括號內。 – 2013-04-24 12:53:13