2010-09-13 5 views
2

Je suis très nouveau à XQuery alors excusez-moi si je suis en quelque sorte manquant quelque chose.XQuery valeurs distinctes avec problème clause where

Je suis en train d'extraire des données où certains sous-nœuds d'un élément sont DISTINCT, ainsi que où est un certain nœud frère est égal à une chaîne prédéfinie

for $product in fn:distinct-values(document('cpwdoc')/root/package/properties/value[@key="product"]) 
where document('cpwdoc')/root/package/categories/category[@name="Cheap"] 
return $product 

Le XML J'Interrogation ressemble à ceci :

<root> 
<package> 
     <title>Some package 1</title> 
     <categories><category group="Other" name="Cheap"/></categories> 
     <properties> 
     <value key="product">BLUE-TOOTHBRUSH</value> 
     </properties> 
    </package> 
<package> 
     <title>Some package 2</title> 
     <categories><category group="Other" name="Expensive"/></categories> 
     <properties> 
     <value key="product">BLUE-TOOTHBRUSH</value> 
     </properties> 
    </package> 
<package> 
     <title>Some package 3</title> 
     <categories><category group="Other" name="Expensive"/></categories> 
     <properties> 
     <value key="product">TOOTHPASTE</value> 
     </properties> 
    </package> 
</root> 

donc, fondamentalement, je veux seulement occurances DISTINCTS du produit, et que si l'attribut nom de la catégorie est égal à « bon marché ».

Ma requête renvoie des produits DISTINCT, mais la clause where semble n'avoir aucun effet, elle renvoie toujours des produits dont la catégorie est "Cher".

Quelqu'un peut-il conseiller sur ce que je fais mal.

Répondre

4

Votre clause where:

where document('cpwdoc')/root/package/categories/category[@name="Cheap"] 

est étendu vers:

where boolean(document('cpwdoc')...) 

qui équivaut à

where exists(document('cpwdoc')...) 

et ainsi vous retournez tous les produits tant qu'il y est au moins un produit bon marché.

Vous voulez quelque chose comme le

suivant
distinct-values(
    for $package in document('cpwdoc')/root/package 
    let $value := $package/properties/value 
    where $value/@key = "product" and $package/categories/category/@name="Cheap" 
    return $value 
) 

qui, si vous aimez les expressions de chemin est le même que

distinct-values(document('cpwdoc')/root/package[categories/category/@name="Cheap"]/properties/value[@key="product"]) 
+0

Impressionnant, merci beaucoup! Cela a fonctionné parfaitement. – BoomShaka