xQuery - 计数功能

时间:2012-12-08 23:16:34

标签: xquery

我希望形成一个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>

非常感谢任何帮助!

3 个答案:

答案 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 ''