想要使用XQUERY从XML中检索唯一的节点

时间:2013-01-28 06:58:48

标签: xquery xquery-sql

我的XML如下:

<Root>  
    <Inv><Id>1</Id><Name>John</Name></Inv>
    <Inv><Id>2</Id><Name>Tom</Name></Inv>
    <Inv><Id>1</Id><Name>John</Name></Inv>
    <Inv><Id>4</Id><Name>Harry</Name></Inv>

</Root>

想要使用XQUERY仅检索唯一的节点。

你能指导一下吗?

2 个答案:

答案 0 :(得分:1)

以下XQuery通过对<Inv>元素序列进行deep-equal()比较来生成<Inv>元素的独特列表:

let $invSequence := /Root/Inv
(:
  For each position(),
  return the <inv> element who's position is equal to the current number,
  and who's previous siblings are not deep-equal() 
:)
for $pos in (1 to count($invSequence))
return $invSequence[$pos] 
                    [not(some $inv in $invSequence[position() < $pos] 
                           satisfies deep-equal(., $inv))]

结果:

<Inv>
   <Id>1</Id>
   <Name>John</Name>
</Inv>
<Inv>
   <Id>2</Id>
   <Name>Tom</Name>
</Inv>
<Inv>
   <Id>4</Id>
   <Name>Harry</Name>
</Inv>

答案 1 :(得分:0)

如果你知道结构并且只有<Id><Name>的两个子元素,那么你可以按这些元素分组并从组中选择第一个元素:

for $inv in /Root/Inv
  let $id := $inv/Id
  let $name := $inv/Name
  group by $id, $name
return $inv[1]