2

私は以下のように2つのxmlファイルを持っています:

staff.xml
<staff>
  <person>
    <PID>1</PID>
    <name>John</name>
  </person>
  <person>
    <PID>2</PID>
    <name>Rain</name>
  </person>
  <person>
    <PID>3</PID>
    <name>Bain</name>
  </person>
</staff>

fruit.xml
<fruit>
  <fruitname PID="1" >Apple<fruitname>
  <fruitname PID="1" >Orange<fruitname>
  <fruitname PID="2" >Orange<fruitname>
</fruit>

私が書いたコードは次のとおりです。出力は重複した名前のリストでした。問題は、オレンジを食べた人の名前を数回ではなく1回だけ返すようにすることです。異なる値($ / name)を返すようなことをすることは可能ですか、それとも重複を削除する他の方法はありますか?

for $s in doc("staff.xml")//person
for $f in doc("fruit.xml")//fruitname
where $s/PID=$f/@PID and $/f[@type="orange"]
return $s/name

以下のようなものを試しましたが、重複することなくアトミック値に変更されますが、アトミック値ではなく要素として出力する必要があります。

  distinct-values(
    for $s in doc("staff.xml")//person
    for $f in doc("fruit.xml")//fruitname
    where $s/PID=$f/@PID and $/f[@type="orange"]
    return $s/name)
4

3 に答える 3

0

使用

for $pid in distinct-values(doc("fruit.xml")/*/*[@type eq 'orange']/@PID)
  return
    doc('staff.xml')/*/*[PID eq $pid][1]/name
于 2012-10-05T16:05:53.373 に答える
0

暗黙的な結合を使用してそれを行うこともできます。

doc("staff.xml")//person[PID = doc("fruit.xml")//fruitname[@type="orange"]/@PID]
于 2012-10-05T16:13:23.773 に答える
0

これを試して

for $i in doc('test')//fruit
   return $i/fruitname[(index-of(doc('test')//fruit/fruitname, .)[position() > 1])[1]]/string()

Fruits.xmlの場合

<fruit>
    <fruitname PID="1" >Apple</fruitname>
    <fruitname PID="1" >Orange</fruitname>
    <fruitname PID="2" >Orange</fruitname>
    <fruitname PID="3" >Pears</fruitname>
    <fruitname PID="2" >Mango</fruitname>
    <fruitname PID="1" >Apple</fruitname>
    <fruitname PID="4" >Guava</fruitname>
    <fruitname PID="5" >Orange</fruitname>
</fruit>

Xqueryの結果

 Orange Apple

ここで試してください:http://basex.org/products/live-demo/

于 2012-10-06T04:59:26.287 に答える