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.xml 和 2.xml 在搜索结果中作为 uri 属性。
现在,我需要将这两个文档转换为单个 JSON 文件,其中包含文档 URI。我的做法是:
- 使用fn:doc函数阅读XML文档。
- 将 uri 元素添加到结果文档。
- 转换为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>
第一个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。我的做法是:
- 使用fn:doc函数阅读XML文档。
- 将 uri 元素添加到结果文档。
- 转换为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>