Обработка XML с помощью XQuery - неправильный вывод

У меня есть 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. подсчет total_sum этой категории

Большое Вам спасибо


person arcus    schedule 03.05.2017    source источник


Ответы (1)


В вашем запросе несколько проблем:

  1. Вы суммируете cost из всех автомобилей в базе данных, а не автомобилей в каждой категории.

  2. Ни в одном car нет элемента с именем cost, только price и rental.

  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>
person Leo Wörteler    schedule 03.05.2017
comment
Большое тебе спасибо. Помогла 3-я проблема (такая мелочь и может многое поменять ...). - person arcus; 03.05.2017