1

所以我有这两个 XML 文件:

数据.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 个 ingr。

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

1 回答 1

1

我做的第一件事就是只保留想要的数据的 ID。但后来我想做一个 for 语句,快速找到具有相同 id(唯一)的 ingr,而不是扫描文件的任何 83882 个 ingr。

我不相信在标准 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])
于 2012-12-23T20:53:56.250 回答