我希望形成一个xQuery,如果这个类别包含超过x的书籍数量,它将返回书籍的类别。例如,如果我有4个类别;音乐,电影,教育,健康和他们都有1本书,除了音乐有3,我正在寻找列出该类别。我尝试了一系列查询,但似乎无法正确使用,我每次都没有得到任何结果,我相信我需要在某些时候使用不同的值?不太确定。
下面可以看到源代码的一个示例,我在编辑器中测试查询,该编辑器不会将源文件保存为文件,因此对我来说测试xQuery必须从以下开始:
e.g。 for $ x in / bookstore / book ...
<bookstore>
<book category="Music">
<year> 2005 </year>
<price> 50 </price>
</book>
<book category="Music">
<year> 2010 </year>
<price> 35 </price>
</book>
<book category="Music">
<year> 1982 </year>
<price> 70 </price>
</book>
<book category="Film">
<year> 2000 </year>
<price> 10 </price>
</book>
<book category="Health">
<year> 1965 </year>
<price> 50 </price>
</book>
<book category="Education">
<year> 2012 </year>
<price> 70 </price>
</book>
</bookstore>
非常感谢任何帮助!
答案 0 :(得分:5)
与@ koopajah的答案类似,因为我已经写过它,我会提交它......
for $category in distinct-values(/*/book/@category)
where count(/*/book[@category=$category]) >= 3
return
<results>{$category}</results>
使用外部文档......
let $doc := doc('input.xml')
for $category in distinct-values($doc/*/book/@category)
where count($doc/*/book[@category=$category]) >= 3
return
<results>{$category}</results>
来自评论的修改后的xquery ......
for $x in doc('input.xml')/bookstore
for $y in distinct-values($x/book/@category)
where count($x/book[@category=$y]) >= 3
return $y
答案 1 :(得分:4)
使用此XQuery,它也是纯XPath 2.0表达式。注意distinct-values()
未使用:
(/*/*/@category)[index-of(/*/*/@category, .)[3]]/string()
在提供的XML文档上进行评估:
<bookstore>
<book category="Music">
<year> 2005 </year>
<price> 50 </price>
</book>
<book category="Music">
<year> 2010 </year>
<price> 35 </price>
</book>
<book category="Music">
<year> 1982 </year>
<price> 70 </price>
</book>
<book category="Film">
<year> 2000 </year>
<price> 10 </price>
</book>
<book category="Health">
<year> 1965 </year>
<price> 50 </price>
</book>
<book category="Education">
<year> 2012 </year>
<price> 70 </price>
</book>
</bookstore>
产生了想要的正确结果:
Music
答案 2 :(得分:2)
我刚刚在BaseX数据库中尝试过此查询,它似乎按预期工作:
for $cat in distinct-values(/bookstore/book/@category)
let $nbBook := count(/bookstore/book[@category=$cat])
return if($nbBook > 1) then $cat else ''