我有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)
答案 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