我是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子句似乎没有效果,它仍然返回类别为“昂贵”的产品。
任何人都可以建议我做错了什么。
答案 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"])