XQuery与where子句问题的不同值

时间:2010-09-13 17:14:41

标签: distinct xquery where

我是XQuery的新手,请原谅我,如果我在某种程度上遗漏了什么。

我正在尝试提取元素的某些子节点为DISTINCT的数据,以及某个兄弟节点等于某个预定义字符串的位置

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

我查询的XML看起来像这样:

<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>

所以基本上我只想要产品的DISTINCT出现,并且只有当类别的name属性等于“Cheap”时才会出现。

我的查询返回DISTINCT产品,但where子句似乎没有效果,它仍然返回类别为“昂贵”的产品。

任何人都可以建议我做错了什么。

1 个答案:

答案 0 :(得分:4)

你的where子句:

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

扩展为:

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

相当于

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

所以只要有至少一种便宜的产品,你就会退回所有产品。

您想要类似以下内容

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
)

如果您喜欢路径表达式,则与

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