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>

我写的代码如下:输出是重复名称列表。现在的问题是我希望只返回一次而不是多次返回吃橙子的人的名字。是否可以执行类似返回不同值($/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 $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 回答
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 回答