使用XQuery处理XML - 输出错误

时间:2017-05-03 12:05:29

标签: xml xquery xquery-3.0

我有一个描述汽车市场的XML文档。汽车市场是停车场的集合体。在每个停车场, 有很多车。每辆车属于一个类别 - 新/二手/租赁。该文件如下:

<car_mart>
    <parking>
        <cars>
            <car cat="new">
                <licence>1PYV582</licence> 
                <price>1000</price> 
            </car>
            <car cat="new">
                <licence>6GD5489</licence> 
                <price>2200</price> 
            </car>
            <car cat="rent"> 
                <rental>20</rental>     
            </car>
            <car cat="new">
                <licence>5FN1254</licence> 
                <price>1500</price> 
            </car>  
            <car cat="rent"> 
                <rental>25</rental>     
            </car>          
            <car cat="new">
                <licence>6HB4524</licence> 
                <price>5800</price> 
            </car>              
            <car cat="rent"> 
                <rental>10</rental>     
            </car>          
        </cars>
    </parking>

    <parking>
        <cars>
          <car cat="used">
            <licence>8UA1294</licence>
            <price>800</price>
          </car>
        </cars>
    </parking>

    <!--<parking>
        ...
    <parking>-->

    <cat tag="new">
        <cat_name>New</cat_name>
    </cat>
    <cat tag="used">
        <cat_name>Used</cat_name>
    </cat>
    <cat tag="rent">
        <cat_name>Rent</cat_name>
    </cat>
</car_mart>

我想使用XQuery提取信息。结果应如下所示:

<cat id="new" total_cost="10500">
   <cat_name>New</cat_name>
   <car price="1000"/>
   <car price="2200"/>
   <car price="1500"/>
   <car price="5800"/>
</cat>
<cat id="used" total_cost="800">
   <cat_name>Used</cat_name>
   <car price="800"/>
</cat>
<cat id="rent" total_cost="55">
   <cat_name>Rent</cat_name>
</cat>

到现在为止,我来到了这个XQuery(3.0)。输出显然不正确。

<car_list>{

for $cat in /car_mart/cat

return 
<cat id="{$cat/@tag}" total_cost="{sum(/car_mart/parking/cars/car/cost)}">
{$cat/cat_name}
  {for $car in /car_mart/parking/cars/car
    return
    if($car/[@cat=$cat/@tag]) 
    then <car price="{$car/price}"></car> 
    else ()
  }

</cat>

}</car_list>

我看到了两个我不知道如何解决的主要问题:

  1. 在一个类别中,只列出该类别的汽车(现在,所有汽车都是)

  2. 计算该类别的total_sum

  3. 非常感谢

1 个答案:

答案 0 :(得分:1)

您的查询中存在多个问题:

  1. 您总结了数据库中所有汽车的cost,而不是每个类别中的汽车。

  2. 任何cost中都没有名为car的元素,只有pricerental

  3. if($car/[@cat=$cat/@tag])中谓词的语法错误,第一个正斜杠/不应存在。

  4. if构造也可以用单个谓词替换。更改所有这些将导致以下查询:

    <car_list>{
      for $cat in /car_mart/cat
      let $cars-in-cat := /car_mart/parking/cars/car[@cat=$cat/@tag]
      return <cat id="{$cat/@tag}" total_cost="{sum($cars-in-cat/(price|rental))}">{
        $cat/cat_name,
        for $car in $cars-in-cat[price]
        return <car price="{$car/price}"></car>
      }</cat>
    }</car_list>