2011-03-12 16 views
5

に子ノードに応じて異なった値を選択します。さんは、私は、次のXMLを持っていると言うのXQuery

<info> 
    <channel> 
     <A> 
      <X> 
      <title>title1</title> 
      </X> 
      <Y value="20"/> 
     </A> 
    </channel> 
    <channel> 
     <A> 
      <X> 
      <title>title1</title> 
      </X> 
      <Y value="20"/> 
     </A> 
     <A> 
      <X> 
      <title>title2</title> 
      </X> 
      <Y value="20"/> 
     </A> 
    </channel> 
</info> 

と、次のXQuery

{ 
for $A in doc('test.xml')//A 
let $TITLE := $A/X/title 
where string($A/Y/value) > 20 
return 
    string($TITLE) 
} 

この、もちろん、出力:

title1 
title1 
title2 

重複を削除するには、distinct-valuesをどうすれば使用できますか? forは本質的に1回の繰り返しにつき1つのアイテムしか与えないので、私はdistinct-values$Aにコールすることはできません。または、重複出力を削除する他の方法はありますか?

問題は別のノードを参照する必要があるため、ノードを返さないため基本的にdistinct-values(doc...)を呼び出しても機能しません。

答えて

5

重複ノードをフィルタリングするためのUPDATE

this answerからのxpathのバリエーションを使用します。

//A[index-of(//A/X/title, X/title)[1]] 

これはあなたに別のtitle sのすべてA秒を与えます。

このxpath式を展開して、Yにフィルタすることもできます.XQueryは不要です。FLWOR最後の1つの正しいのXQueryについて

for $title in distinct-values(doc('test.xml')//A/X/@title) 
return string($title) 

か、単に

distinct-values(doc('test.xml')//A/X/@title) 
+0

1:

更新終了

はあなたが反復したい、その上XPath式にdistinct-valuesを適用します/ XPath式。 –

+0

ありがとうございました!私は後でそれを見てみましょう! – slhck

+0

@slhckだからどうしたの? –

関連する問題