7

我希望形成一个 xQuery,如果该类别包含超过 x 数量的书籍,它会返回书籍的类别。例如,如果我有 4 个类别;音乐、电影、教育、健康,他们都有 1 本书,除了有 3 本书的音乐,我希望列出该类别。我尝试了一系列查询,但似乎无法正确处理,我每次都没有得到任何结果,我相信我需要在某个时候使用 distinct-value?不太确定。

源代码示例如下所示,我在不将源代码保存为文件的编辑器中测试查询,因此我测试 xQuery 必须从以下内容开始:

例如 /bookstore/book 中的 $x...

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

非常感谢任何帮助!

4

3 回答 3

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 
于 2012-12-08T23:27:34.443 回答
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
于 2012-12-09T04:12:22.507 回答
2

我刚刚在 BaseX 数据库中尝试过这个查询,它似乎可以按您的预期工作:

for $cat in distinct-values(/bookstore/book/@category)
let $nbBook := count(/bookstore/book[@category=$cat])
return if($nbBook > 1) then $cat else ''
于 2012-12-08T23:24:22.747 回答