2016-04-11 17 views
2

私は、次のファイルを使用しています:私は以下の結果を得ています私は、XML文書MarkLogic:XML文書から別の名前を取得するXQuery?

for $x at $i in doc("bookstore.xml")/bookstore/book/* 
return fn:distinct-values(name($x)) 

から名前を取得するには、次のクエリを使用しています

<bookstore> 
    <book category="COOKING"> 
    <title lang="en">Everyday Italian</title> 
    <author>Giada De Laurentiis</author> 
    <year>2005</year> 
    <price>30.00</price> 
    </book> 
    <book category="CHILDREN"> 
    <title lang="en">Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
    </book> 
    <book category="WEB"> 
    <title lang="en">XQuery Kick Start</title> 
    <author>James McGovern</author> 
    <author>Per Bothner</author> 
    <author>Kurt Cagle</author> 
    <author>James Linn</author> 
    <author>Vaidyanathan Nagarajan</author> 
    <year>2003</year> 
    <price>49.99</price> 
    </book> 
    <book category="WEB"> 
    <title lang="en">Learning XML</title> 
    <author>Erik T. Ray</author> 
    <year>2003</year> 
    <price>39.95</price> 
    </book> 
</bookstore> 

を:

title 
author 
year 
price 
title 
author 
year 
price 
title 
author 
author 
author 
author 
author 
year 
price 
title 
author 
year 
price 

代わりに、私はちょうど次のように別のものが欲しいです。

title 
author 
year 
price 

私はforループを台無しにしていると思います。誰かがこれを修正して助けてくれる?私はdistinct-values()を使ってみました。運がない。

答えて

4

name($x)には、現在変数$xで参照されている要素の名前が含まれています。 $xは、一度に1つの要素を常に参照するため、にあるdistinct-values()を呼び出すことは役に立ちません。その代わりに、例えばのように、すべての要素名を含むコレクションにdistinct-values()を呼びたい:

let $result := 
    for $x at $i in doc("bookstore.xml")/bookstore/book/* 
    return name($x) 
return fn:distinct-values($result) 

これはまた次のようにプレーンなXPath式を使用して達成することができます。

distinct-values(doc("bookstore.xml")/bookstore/book/*/name(.)) 
+0

ありがとうございました。 Xpathは甘くて短いです。できます。どうもありがとう! – happybayes

4

forループ内でdistinct-values()を呼び出していましたが、式で返されたシーケンス内の各アイテムに対して1回呼び出されました。代わりにdistinct-values()for式の結果を渡す:

fn:distinct-values(
    for $x at $i in doc("bookstore.xml")/bookstore/book/* 
    return name($x) 
) 

ワンサイドノート:node-name()またはlocal-name()は一般name()上で推奨されています。要素のqualified nameが必要な場合は前者を使用し、後者の場合は文字列値のみを使用します。

+0

説明をお願い致します。このソリューションも同様に機能します。ありがとう。 – happybayes

0

あなたはまた試すこと最も簡単なもの

let $x := doc("bookstore.xml")/bookstore/book 
return distinct-values($x/name()) 
関連する問題