第一个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.xml 和 2.xml 作为uri属性。
现在,我需要将这两个文档转换为单个JSON文件,其中包含文档URI。我的方法是:
如何在搜索片段中将@uri
添加到XQuery中的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
这给了我两个单独的文件,这不是我所希望的..
我该如何解决这个问题?
提前致谢
答案 0 :(得分:3)
您可以尝试使用其他子<root>
重建<uri>
元素,如下所示:
....
let $docs :=
for $each in $uri
return <root>{fn:doc($each)/root/*, <uri>{$each}</uri>}</root>
return $docs
答案 1 :(得分:0)
您的解决方案返回多个文档,因为您返回的是多个文档的序列(实际上,您的序列长度为#34; 4&#34;现在由于2个文档和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
这将返回
<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>