Xquery 添加文件名作为元素

Xquery add filename as an element

第一个XML文件1.xml

<root>
    <name>aa</name>
    <phno>bb</phno>
    <email>cc</email>
</root>

第二个XML文件2.xml

<root>
    <name>aa</name>
    <phno>dd</phno>
    <email>ee</email>
</root>

当我搜索 "aa" 时,使用 search:search("aa"),得到 1.xml2.xml 在搜索结果中作为 uri 属性。

现在,我需要将这两个文档转换为单个 JSON 文件,其中包含文档 URI。我的做法是:

  1. 使用fn:doc函数阅读XML文档。
  2. 将 uri 元素添加到结果文档。
  3. 转换为Json.

如何在 XQuery 中将 @uri 从搜索片段添加到 XML 文件?
输出应该是(不应该在数据库中更新):

<root>
    <name>aa</name>
    <phno>bb</phno>
    <email>cc</email>
    <uri>1.xml</uri>
</root>

我尝试使用我对 XQuery 的基本知识,例如:

let $searchResult := search:search("aa")
let $uri := $searchResult/search:result/@uri
let $docs := 
   for $each in $uri
   return (fn:doc($each)/root, <uri>{$each}</uri>)   
return $docs

这给了我两个单独的文件,这不是我想要的..

我该如何解决这个问题?

提前致谢

您可以尝试使用额外的子 <uri> 重建 <root> 元素,如下所示:

....
let $docs := 
   for $each in $uri
       return <root>{fn:doc($each)/root/*, <uri>{$each}</uri>}</root>
return $docs

您的解决方案是 return 处理多个文档,因为您正在 return 处理多个文档的序列(实际上,由于 2,您的序列现在的长度为“4”文档和 2 个未附加的 URI 元素)。

你可以像这样做一些简单的事情:

let $searchResult := search:search("aa")
let $uris := $searchResult/search:result/@uri
let $docs := element documents {
        attribute count {fn:count($uris)},
        for $uri in $uris
            return <document uri='{$uri}'>{fn:doc($uri)/node()}</uri>)   
    }
return $docs

这将return

<documents count="2">
    <document uri="1.xml">
        <root>
            <name>aa</name>
            <phno>bb</phno>
            <email>cc</email>
        </root>
    </document>
    <document uri="2.xml">
        <root>
            <name>aa</name>
            <phno>dd</phno>
            <email>ee</email>
        </root>
    </document>
</documents>