【问题标题】:Process XML using XQuery - incorrect output使用 XQuery 处理 XML - 不正确的输出
【发布时间】:2017-05-03 12:05:29
【问题描述】:

我有一个描述汽车市场的 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>

我发现了 2 个我不知道如何解决的主要问题:

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

  2. 计算该类别的总和

非常感谢

【问题讨论】:

    标签: xml xquery xquery-3.0


    【解决方案1】:

    您的查询存在多个问题:

    1. 您将数据库中所有辆汽车的cost相加,而不是每个类别中的汽车。

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

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

    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>
    

    【讨论】:

    • 非常感谢。第三个问题有所帮助(这样的小事,它可以改变很多......)。
    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2013-11-27
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多