2012-12-23 23 views
1

所以我有這2個XML文件:XQuery:如何快速比較來自不同XML文件的2個ID?

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> 

ingrs.xml

<ingrs> 
    <ingr id="1">...</ingr> 
    <ingr id="2">...</ingr> 
    ... 
    <ingr id="83882">...</ingr> 
</ingrs> 

我做的第一件事就是隻保留想要的數據的ID。但後來我想做一個for語句,它可以快速找到具有相同id(唯一)的ingr,而不是掃描文件的任何83882個入口。

let $ids := //data[./place = 'Mu']/@id return 
    for $i in //ingr 
    where() (: what to do here ? Something like $i/@id = $ids :) 
    return $i 

回答

1

我做的第一件事就是隻保留想要的數據的ID。但是,然後我想要做一個for語句,它可以快速找到具有相同 id(唯一)的ingr,而不是掃描文件的任何83882 ingrs。

我不相信這樣的「快」的方式是標準的XQuery可能的 - 下面的查詢仍然爲O的最壞時間複雜度(N * M),其中NM分別是,兩個XML文檔中的dataingr元素的數量。

在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])