2012-01-10 5 views
1

特定のXQuery問題に関しては完全に立ち止まってきました。最初は、XML文書に同じタイトルの複数の展示がありませんでした。特定の問題に気づいたことを変更しました。結果(XQuisitorで)は、ユニークな展示ごとにガイドのすべての名前を2回または3回表示します、いくつの展示品が同じタイトルを共有しているかによって異なります。XQuery - 別個の値を持たない一意の値を返します

私はなぜ、何らかの入力に感謝します。

ここで私が試したXQueryコードです:

for $u in (//Exhibit/@title) 
let $guide := for $g in //Guide[../@title=$u]/@gname return element Guide {$g} 
return element Exhibit {attribute Title {$u}, $guide } 

例XML-文書:

<?xml version="1.0" encoding="UTF-8"?> 
<Exhibits> 
<Exhibit title = "Renaissance" sdate= "2011-09-05" 
edate= "2012-02-05" sarea = "2400"> 
<Guide gname = "John Smith" > 
<Lang sname ="English"/> 
<Lang sname ="German"/> 
</Guide> 
<Guide gname = "Weber Schneider"> 
<Lang sname = "German"/> 
</Guide> 
<Guide gname = "Robert Lundstrom"> 
<Lang sname = "Swedish"/> 
</Guide> 
<Guide gname = "Paula Munoz"> 
<Lang sname = "Spanish"/> 
<Lang sname = "German"/> 
<Lang sname = "English"/> 
</Guide> 
</Exhibit> 
<Exhibit title = "Renaissance" sdate= "2011-10-06" 
edate= "2011-11-26" sarea = "2000"> 
<Guide gname = "John Smith"> 
<Lang sname ="English"/> 
<Lang sname ="German"/> 
</Guide> 
<Guide gname = "Paula Munoz"> 
<Lang sname = "Spanish"/> 
<Lang sname = "German"/> 
<Lang sname = "English"/> 
</Guide> 
</Exhibit> 
</Exhibits> 

ありがとう!

+1

望ましくない出力につながる例文を追加してください。 –

答えて

1

ユニークな展示品ごとに、と同じ名前のすべての展示品の下にすべてのガイドがあり、これらを表示します。あなたは、現在1からのものにしたい場合は、このクエリを試してみてください。

for $e in //Exhibit 
let $guide := for $g in $e/Guide/@gname return element Guide {$g} 
return element Exhibit {attribute Title { $e/@title }, $guide } 

あなたが提供された入力ファイルを使用すると、クエリが返す:

<Exhibit Title="Renaissance"> 
    <Guide gname="John Smith"/> 
    <Guide gname="Weber Schneider"/> 
    <Guide gname="Robert Lundstrom"/> 
    <Guide gname="Paula Munoz"/> 
    <Guide gname="John Smith"/> 
    <Guide gname="Paula Munoz"/> 
</Exhibit> 
<Exhibit Title="Renaissance"> 
    <Guide gname="John Smith"/> 
    <Guide gname="Weber Schneider"/> 
    <Guide gname="Robert Lundstrom"/> 
    <Guide gname="Paula Munoz"/> 
    <Guide gname="John Smith"/> 
    <Guide gname="Paula Munoz"/> 
</Exhibit> 

と修正1つの利回り:

<Exhibit Title="Renaissance"> 
    <Guide gname="John Smith"/> 
    <Guide gname="Weber Schneider"/> 
    <Guide gname="Robert Lundstrom"/> 
    <Guide gname="Paula Munoz"/> 
</Exhibit> 
<Exhibit Title="Renaissance"> 
    <Guide gname="John Smith"/> 
    <Guide gname="Paula Munoz"/> 
</Exhibit> 
+0

LeoWörteler、私は、OPは1つの「Exhibit」だけを作りたいと思っています。 –

2

使用

let $vals := /*/Exhibit/@title 
    return 
    for $t in $vals[index-of($vals, .)[1]] 
     return 
     element Exhibit 
      { attribute Title {$t}, 
      let $gvals := /*/Exhibit[@title eq $t]/Guide/@gname 
       return 
       for $gname in $gvals[index-of($gvals, .)[1]] 
        return 
        element Guide {attribute gname {$gname}} 
      } 
(わずかにより複雑に提供される一つ、)このXML文書に適用される10

<Exhibits> 
    <Exhibit title = "Renaissance" sdate= "2011-09-05" edate= "2012-02-05" sarea = "2400"> 
    <Guide gname = "John Smith" > 
     <Lang sname ="English"/> 
     <Lang sname ="German"/> 
    </Guide> 
    <Guide gname = "Weber Schneider"> 
     <Lang sname = "German"/> 
    </Guide> 
    <Guide gname = "Robert Lundstrom"> 
     <Lang sname = "Swedish"/> 
    </Guide> 
    <Guide gname = "Paula Munoz"> 
     <Lang sname = "Spanish"/> 
     <Lang sname = "German"/> 
     <Lang sname = "English"/> 
    </Guide> 
    </Exhibit> 
    <Exhibit title = "Renaissance" sdate= "2011-10-06" edate= "2011-11-26" sarea = "2000"> 
    <Guide gname = "John Smith"> 
     <Lang sname ="English"/> 
     <Lang sname ="German"/> 
    </Guide> 
    <Guide gname = "Paula Munoz"> 
     <Lang sname = "Spanish"/> 
     <Lang sname = "German"/> 
     <Lang sname = "English"/> 
    </Guide> 
    </Exhibit> 
    <Exhibit title = "Middle Age" sdate= "2011-10-06" edate= "2011-11-26" sarea = "2000"> 
    <Guide gname = "John Smith"> 
     <Lang sname ="English"/> 
     <Lang sname ="German"/> 
    </Guide> 
    <Guide gname = "Paula Munoz"> 
     <Lang sname = "Spanish"/> 
     <Lang sname = "German"/> 
     <Lang sname = "English"/> 
    </Guide> 
    </Exhibit> 
    <Exhibit title = "Middle Age" sdate= "2011-09-05" edate= "2012-02-05" sarea = "2400"> 
    <Guide gname = "John Smith" > 
     <Lang sname ="English"/> 
     <Lang sname ="German"/> 
    </Guide> 
    <Guide gname = "Weber Schneider"> 
     <Lang sname = "German"/> 
    </Guide> 
    <Guide gname = "Robert Lundstrom"> 
     <Lang sname = "Swedish"/> 
    </Guide> 
    <Guide gname = "Paula Munoz"> 
     <Lang sname = "Spanish"/> 
     <Lang sname = "German"/> 
     <Lang sname = "English"/> 
    </Guide> 
    </Exhibit> 
</Exhibits> 

を希望、正しい結果が製造される:

<Exhibit Title="Renaissance"> 
    <Guide gname="John Smith"/> 
    <Guide gname="Weber Schneider"/> 
    <Guide gname="Robert Lundstrom"/> 
    <Guide gname="Paula Munoz"/> 
</Exhibit> 
<Exhibit Title="Middle Age"> 
    <Guide gname="John Smith"/> 
    <Guide gname="Paula Munoz"/> 
    <Guide gname="Weber Schneider"/> 
    <Guide gname="Robert Lundstrom"/> 
</Exhibit> 

説明ました:

原子値のシーケンスについては、$vals

$vals[index-of($vals, .)[1]] 

$valsに含まれるすべての個別の値を持つアイテムのセットを生成します。

関連する問題