XQuery基础知识 - 如何跟踪多个变量?

时间:2014-12-09 14:44:44

标签: xquery

XQuery中,我如何跟踪某些变量,在这种情况下,返回所有这些变量的平均值?

这是我正在试验的数据库的一小部分。

<?xml version="1.0" encoding="UTF-8"?>

<catalog> 
  <book id="bk101"> 
    <author>Gambardella, Matthew</author>  
    <title>XML Developer's Guide</title>  
    <genre>Computer</genre>  
    <price>44.95</price>  
    <publish_date>2000-10-01</publish_date>  
    <description>An in-depth look at creating applications with XML.</description> 
  </book>  
  <book id="bk102"> 
    <author>Ralls, Kim</author>  
    <title>Midnight Rain</title>  
    <genre>Fantasy</genre>  
    <price>5.95</price>  
    <publish_date>2000-12-16</publish_date>  
    <description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description> 
  </book>  
  <book id="bk103"> 
    <author>Corets, Eva</author>  
    <title>Maeve Ascendant</title>  
    <genre>Fantasy</genre>  
    <price>5.95</price>  
    <publish_date>2000-11-17</publish_date>  
    <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description> 
  </book> 
</catalog>

现在,我想要做的,或者试图了解它是如何运作的,就是获得所有三本书的平均价格。

我尝试过的样子:

for $eachElement in catalog/book
where $eachElement/price > 0
return avg($eachElement/price)

这样做是单独返回每个价格。你可能猜到,这不是我想要的。

有人可以向我解释如何获得所有三本书的平均价格,以及XQuery如何完成这一过程?

2 个答案:

答案 0 :(得分:1)

你现在确实正在“迭代”所有项目。函数avg(..)实际上接受一系列元素,所以你应该做的就是选择你想要平均的所有价格元素并将它直接传递给avg(..)函数:

avg(catalog/book/price)

答案 1 :(得分:1)

您确实使用了FLWOR表达式,即您正在迭代序列。 。此序列由catalog/book生成,其中包含所有书籍元素。当你现在将它放入for表达式时,每本书将被分开计算。因此,您可以计算每个步骤中一个元素的平均值 - 当然,这将始终是元素本身。

因此,您应该将整个序列传递给avg。您可以使用谓词[]过滤掉值:

avg(catalog/book[price > 0]/price)