明显的价值问题

时间:2012-10-05 15:34:46

标签: xml

我有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>

我写的代码如下:输出是一个重复名称的列表。问题现在是我想要吃橙色的人的名字只返回一次而不是几次。是否可以执行返回distinct-values($ / 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)

3 个答案:

答案 0 :(得分:0)

使用

for $pid in distinct-values(doc("fruit.xml")/*/*[@type eq 'orange']/@PID)
  return
    doc('staff.xml')/*/*[PID eq $pid][1]/name

答案 1 :(得分:0)

您甚至可以使用隐式联接来执行此操作:

doc("staff.xml")//person[PID = doc("fruit.xml")//fruitname[@type="orange"]/@PID]

答案 2 :(得分: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/