2010-09-29 2 views
0

У меня есть структура XML, которую мне нужно запросить с помощью XQuery. Насколько я смог найти, это может быть даже невозможно, но поскольку я настолько новичок в XQuery, я думал, что могу спросить.Оператор XQuery, который группирует результаты

мне нужно запросить XML ниже и вернуть то, что выглядит как:

<product> 
<title>Acer Liquid</title> 
<image>ACER-LIQUID.jpg</image> 
<networks> 
    <network>O2O</network> 
    <network>VOD</network> 
</networks> 
<colours> 
    <colour>Blue</colour> 
    <colour>Black</colour> 
</colours> 
</product> 

Так что мой запрос по существу что-то вроде: Получить все сведения о продукте, где Eсть salespackage, что принадлежит к «Pay Monthly» который указывает на него (через main_product) и присоединяет свойство сети из каждого пакета продаж, который указывает на него. Но группируйте результаты по полю product.product_model.

Источник XML:

<root> 
<package> 
    <title>package1</title> 
    <categories><category group="Other" name="Pay Monthly"/></categories> 
    <properties> 
    <value key="main_product">PRODUCT#14649766#PART#ACERLIQUIDBLACK</value> 
    <value key="network_code">O2O</value> 
    </properties> 
</package> 
<package> 
    <title>package2</title> 
    <categories><category group="Other" name="Pay Monthly"/></categories> 
    <properties> 
    <value key="main_product">PRODUCT#14649700#PART#ACERLIQUIDBLUE</value> 
    <value key="network_code">VOD</value> 
    </properties> 
</package> 
<product> 
    <title>Acer Liquid</title> 
    <properties> 
    <value key="product_code">PRODUCT#14649700#PART#ACERLIQUIDBLUE</value> 
    <value key="product_model">Acer Liquid|ACER_LIQUID</value> 
    <value key="product_image_url">ACER-LIQUID.jpg</value> 
    <value key="colour">Blue</value> 
    </properties> 
</product> 
<product> 
    <title>Acer Liquid</title> 
    <properties> 
    <value key="product_code">PRODUCT#14649766#PART#ACERLIQUIDBLACK</value> 
    <value key="product_model">Acer Liquid|ACER_LIQUID</value> 
    <value key="product_image_url">ACER-LIQUID.jpg</value> 
    <value key="colour">Black</value> 
    </properties> 
</product> 
</root> 

ответ

1

Довольно сложный запрос для XQuery 1.0:

declare ordering unordered; 

declare function local:values($items as node()*, 
           $property as xs:string) as xs:string* { 
    distinct-values($items/properties/value[@key eq $property]) 
}; 

declare function local:filter($items as node()*, 
           $property as xs:string, 
           $values as xs:string*) as node()* { 
    $items[properties/value[@key eq $property] = $values] 
}; 


let $packages := doc('source')/root/package[categories/category[@name eq 'Pay Monthly']] 
let $products := local:filter(doc('source')/root/product, 
           'product_code', 
           local:values($packages, 'main_product')) 

for $model   in local:values($products, 'product_model') 
let $model_products := local:filter($products, 'product_model', $model) 
let $model_packages := local:filter($packages, 
            'main_product', 
            local:values($model_products, 'product_code')) 

return 
<product> 
    {$model_products[1]/title} 
    <image>{local:values($model_products[1], 'product_image_url')}</image> 
    <networks>{ 
     for $net in local:values($model_packages, 'network_code') 
     return <network>{$net}</network> 
    }</networks> 
    <colours>{ 
     for $cl in local:values($model_products, 'colour') 
     return <colour>{$cl}</colour> 
    }</colours> 
</product> 
+0

Благодаря Shcheklein! Я попробую это :) – BoomShaka

0

Это XQuery:

for $title in (/root/product/title)[index-of(/root/product/title,.)[1]] 
let $ProductsProp := /root/product[title=$title]/properties/value 
return 
<product> 
    {$title} 
    <image>{string(($ProductsProp[@key='product_image_url'])[1])}</image> 
    <networks>{ 
     for $network in /root/package/properties 
            [value[@key='main_product'] 
            = $ProductsProp[@key='product_code']] 
            /value[@key='network_code']/string() 
     return 
     <network>{$network}</network> 
    }</networks> 
    <colours>{ 
     for $colour in $ProductsProp[@key='colour']/string() 
     return 
     <colour>{$colour}</colour> 
    }</colours> 
</product> 

Выход:

<product> 
    <title>Acer Liquid</title> 
    <image>ACER-LIQUID.jpg</image> 
    <networks> 
     <network>O2O</network> 
     <network>VOD</network> 
    </networks> 
    <colours> 
     <colour>Blue</colour> 
     <colour>Black</colour> 
    </colours> 
</product> 

Примечание: XPath 2.0 группирования выражение $vSeq[index-of($vSeq,.)[1]]

Смежные вопросы