我正在努力解决XQuery问题。我有一个XML产品列表,其中包含来自2个不同产品目录系统的产品(由于合并和收购)。一些产品是重复的(每个系统中有1个)。重复项具有相同的产品名称,但价格不同。
我想返回显示最便宜产品价格的不同产品列表。例如,请考虑此输入XML
<?xml version="1.0" encoding="UTF-8"?>
<ns1:ProductList xmlns:ns1="http://www.mycorp.com/bus/prod/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<ns1:Product>
<ns1:Id>2</ns1:Id>
<ns1:Name>Ace Ski Boot</ns1:Name>
<ns1:Description>An intermediate ski boot</ns1:Description>
<ns1:Price>109.99</ns1:Price>
<ns1:Warehouse>CZE_PRAGUE</ns1:Warehouse>
<ns1:Icon_url/>
<ns1:Latitude>50.07554</ns1:Latitude>
<ns1:Longitude>14.4378</ns1:Longitude>
</ns1:Product>
<ns1:Product>
<ns1:Id>SUM10012</ns1:Id>
<ns1:Name>Ace Ski Boot</ns1:Name>
<ns1:Description>Intermediate ski boot</ns1:Description>
<ns1:Price>200.0</ns1:Price>
<ns1:Warehouse>Seattle</ns1:Warehouse>
<ns1:Icon_url/>
<ns1:Latitude>47.60621</ns1:Latitude>
<ns1:Longitude>-122.33207</ns1:Longitude>
</ns1:Product>
<ns1:Product>
<ns1:Id>4</ns1:Id>
<ns1:Name>Ace Ski Pole</ns1:Name>
<ns1:Description>A ski pole for skiers with an intermediate skill level</ns1:Description>
<ns1:Price>29.99</ns1:Price>
<ns1:Warehouse>FRA_PARIS</ns1:Warehouse>
<ns1:Icon_url/>
<ns1:Latitude>48.856613</ns1:Latitude>
<ns1:Longitude>2.352222</ns1:Longitude>
</ns1:Product>
<ns1:Product>
<ns1:Id>SUM10022</ns1:Id>
<ns1:Name>Ace Ski Pole</ns1:Name>
<ns1:Description>Intermediate ski pole</ns1:Description>
<ns1:Price>21.950000762939453</ns1:Price>
<ns1:Warehouse>Seattle</ns1:Warehouse>
<ns1:Icon_url/>
<ns1:Latitude>47.60621</ns1:Latitude>
<ns1:Longitude>-122.33207</ns1:Longitude>
</ns1:Product>
它显示了2个重复的产品。我希望返回以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:ProductList xmlns:ns1="http://www.mycorp.com/bus/prod/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<ns1:Product>
<ns1:Id>2</ns1:Id>
<ns1:Name>Ace Ski Boot</ns1:Name>
<ns1:Description>An intermediate ski boot</ns1:Description>
<ns1:Price>109.99</ns1:Price>
<ns1:Warehouse>CZE_PRAGUE</ns1:Warehouse>
<ns1:Icon_url/>
<ns1:Latitude>50.07554</ns1:Latitude>
<ns1:Longitude>14.4378</ns1:Longitude>
</ns1:Product>
<ns1:Product>
<ns1:Id>SUM10022</ns1:Id>
<ns1:Name>Ace Ski Pole</ns1:Name>
<ns1:Description>Intermediate ski pole</ns1:Description>
<ns1:Price>21.950000762939453</ns1:Price>
<ns1:Warehouse>Seattle</ns1:Warehouse>
<ns1:Icon_url/>
<ns1:Latitude>47.60621</ns1:Latitude>
<ns1:Longitude>-122.33207</ns1:Longitude>
</ns1:Product>
我已经看到XQuery用于返回不同的值,但不是您需要选择子元素(ns1:Price)元素的最低值的位置。谁能指出我正确的方向?非常感谢提前!
答案 0 :(得分:3)
如果你有XQuery 3.0,那么你可以使用group by
表达式。例如:
xquery version "3.0";
declare namespace ns1 = "http://www.mycorp.com/bus/prod/";
for $product in //ns1:Product
let $product-name := $product/ns1:Name
group by $product-name
return
<ns1:Product>
{
$product[xs:decimal(ns1:Price) eq min($product/xs:decimal(ns1:Price))]
}
</ns1:Product>
如果您没有XQuery 3.0,但拥有XQuery 1.0,那么您需要首先使用fn:distinct-values
确定您希望分组的唯一产品名称,然后您可以在其中循环唯一名称和创建组(具有相同名称的产品),然后您可以使用谓词过滤以确定最便宜的产品。例如:
xquery version "1.0";
declare namespace ns1 = "http://www.mycorp.com/bus/prod/";
let $unique-product-names := distinct-values(//ns1:Product/ns1:Name)
return
for $product-name in $unique-product-names
let $grouped-products := //ns1:Product[ns1:Name eq $product-name]
let $group-cheapest-price := min($grouped-products/xs:decimal(ns1:Price))
return
$grouped-products[xs:decimal(ns1:Price) eq $group-cheapest-price]