7

このカテゴリにx冊以上の本が含まれている場合、本のカテゴリを返すxQueryを作成しようとしています。たとえば、4 つのカテゴリがあるとします。音楽、映画、教育、健康、それらはすべて 1 冊の本を持っていますが、3 冊の音楽を除いて、そのカテゴリをリストしたいと考えています。さまざまなクエリを試しましたが、うまくいかないようです。毎回結果が得られません。ある時点で個別値を使用する必要があると思いますか? よくわかりません。

ソースの例を以下に示します。ソースをファイルとして保存しないエディターでクエリをテストしています。

たとえば、/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を使用します。これは、純粋なXPath2.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 に答える