XQuery:如何快速比较来自不同XML文件的2个id?

XQuery:如何快速比较来自不同XML文件的2个id?,xml,xquery,Xml,Xquery,我有两个XML文件: datas.xml <datas> <data id="1"><place>Mu</place></data> <data id="2"><place>Atlantis</place></data> ... <data id="28492"><place>Mu</place></data> </da

我有两个XML文件:

datas.xml

<datas>
  <data id="1"><place>Mu</place></data>
  <data id="2"><place>Atlantis</place></data>
  ...
  <data id="28492"><place>Mu</place></data>
</datas>
我要做的第一件事是只保留所需数据的ID。但是 我想做一个for语句,快速找到具有相同
id
(唯一),而不是扫描文件的任何83882 INGR

let $ids := //data[./place = 'Mu']/@id return
  for $i in //ingr
  where() (: what to do here ? Something like $i/@id = $ids :)
  return $i
我不相信在标准XQuery中有一种“更快”的方法可以做到这一点——下面的查询的时间复杂度仍然是O(N*M),其中
N
M
分别是两个XML文档中
数据
ingr
元素的数量

在XSLT中,可以在任何节点上定义一个键(索引),该键是其他节点的函数,使用该索引时,可以生成接近O(1)的快速搜索

使用

let $doc1 :=
    <datas>
      <data id="1"><place>Mu</place></data>
      <data id="2"><place>Atlantis</place></data>
      ...
      <data id="28492"><place>Mu</place></data>
    </datas>

    , $doc2 :=
        <ingrs>
          <ingr id="1">...</ingr>
          <ingr id="2">...</ingr>
          ...
          <ingr id="83882">...</ingr>
        </ingrs>,
        $data := $doc1//data[place='Mu'],
        $ids := $data/@id
  return
    ($data, $doc2//ingr[@id = $ids])
让$doc1:=
亩
亚特兰蒂斯
...
亩
,$doc2:=
...
...
...
...
,
$data:=$doc1//data[place='Mu'],
$id:=$data/@id
返回
($data,$doc2//ingr[@id=$ids])
我要做的第一件事是只保留所需数据的ID。但是 我想做一个for语句,快速找到具有相同
id
(唯一),而不是扫描文件的任何83882 INGR

let $ids := //data[./place = 'Mu']/@id return
  for $i in //ingr
  where() (: what to do here ? Something like $i/@id = $ids :)
  return $i
我不相信在标准XQuery中有一种“更快”的方法可以做到这一点——下面的查询的时间复杂度仍然是O(N*M),其中
N
M
分别是两个XML文档中
数据
ingr
元素的数量

在XSLT中,可以在任何节点上定义一个键(索引),该键是其他节点的函数,使用该索引时,可以生成接近O(1)的快速搜索

使用

let $doc1 :=
    <datas>
      <data id="1"><place>Mu</place></data>
      <data id="2"><place>Atlantis</place></data>
      ...
      <data id="28492"><place>Mu</place></data>
    </datas>

    , $doc2 :=
        <ingrs>
          <ingr id="1">...</ingr>
          <ingr id="2">...</ingr>
          ...
          <ingr id="83882">...</ingr>
        </ingrs>,
        $data := $doc1//data[place='Mu'],
        $ids := $data/@id
  return
    ($data, $doc2//ingr[@id = $ids])
让$doc1:=
亩
亚特兰蒂斯
...
亩
,$doc2:=
...
...
...
...
,
$data:=$doc1//data[place='Mu'],
$id:=$data/@id
返回
($data,$doc2//ingr[@id=$ids])