XQuery отличные значения с проблемой условия where - PullRequest
2 голосов
/ 13 сентября 2010

Я очень плохо знаком с 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, но, похоже, что предложение where не оказывает никакого влияния, он по-прежнему возвращает продукты, для которых установлена ​​категория "Дорого".

Может кто-нибудь посоветовать, что я делаю не так.

1 Ответ

4 голосов
/ 13 сентября 2010

Предложение 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"])
...