我需要编写一个 XPath 表达式,根据以下数据查找至少有 2 个供应商的城市(表达式应返回芝加哥和麦迪逊,因为它们各有 2 个供应商):
<SuppliersList>
<Supplier name="Joe">
<City>Paris</City>
<Product name="Airplane"/>
<Product name="Milk"/>
<Product name="TV"/>
<Product name="Orange"/>
</Supplier>
<Supplier name="Herman">
<City>Chicago</City>
<Product name="Orange"/>
</Supplier>
<Supplier name="Bernstein">
<City>Madison</City>
<Product name="Truck"/>
<Product name="TV"/>
</Supplier>
<Supplier name="Hunter">
<City>Wausau</City>
</Supplier>
<Supplier name="Mayer">
<City>Madison</City>
</Supplier>
<Supplier name="Rosenfeld">
<City>Chicago</City>
<Product name="Computer"/>
<Product name="Book"/>
<Product name="Truck"/>
</Supplier>
</SuppliersList>
任何帮助将不胜感激
//Supplier[City = following::Supplier/City]/City
解释:
- 获取所有
Supplier
元素- 其中
City
元素等于当前节点下的任何Supplier/City
元素
- 其中
- 并采取
City
元素
当然,这在 XSLT 模板中要容易得多
编辑
现在我看到你使用的是XQuery,而不是XPath:
DECLARE @x xml
SET @x = '
<SuppliersList>
<Supplier name="Joe">
<City>Paris</City>
<Product name="Airplane"/>
<Product name="Milk"/>
<Product name="TV"/>
<Product name="Orange"/>
</Supplier>
<Supplier name="Herman">
<City>Chicago</City>
<Product name="Orange"/>
</Supplier>
<Supplier name="Bernstein">
<City>Madison</City>
<Product name="Truck"/>
<Product name="TV"/>
</Supplier>
<Supplier name="Hunter">
<City>Wausau</City>
</Supplier>
<Supplier name="Mayer">
<City>Madison</City>
</Supplier>
<Supplier name="Rosenfeld">
<City>Chicago</City>
<Product name="Computer"/>
<Product name="Book"/>
<Product name="Truck"/>
</Supplier>
</SuppliersList>'
SELECT @x.query('
let $cities := //City
for $city in distinct-values($cities)
where count($cities[. eq $city]) >= 2
return $city
')