Xquery将filename添加为元素

时间:2015-06-01 13:07:57

标签: xquery marklogic

第一个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。我的方法是:

  1. 使用fn:doc函数读取XML文档。
  2. 将uri元素添加到结果文档中。
  3. 转换为Json。
  4. 如何在搜索片段中将@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
    

    这给了我两个单独的文件,这不是我所希望的..

    我该如何解决这个问题?

    提前致谢

2 个答案:

答案 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>