XQuery:如何快速比较来自不同XML文件的2个id?
我有两个XML文件: datas.xmlXQuery:如何快速比较来自不同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
<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])