Marklogic如何循环每个节点

时间:2018-08-10 20:57:00

标签: marklogic

我尝试循环每个$node以获取元素,然后在string-join()中将所有元素的local:function一起返回。但它不起作用。

  

XDMP-AS:(err:XPTY0004)local:test-case($ value)-强制无效:“ EF127557 Y”作为node()。

我不知道此错误代码的含义。

xquery version "1.0-ml";
declare namespace techco="http://techco.com/db/record";
declare namespace meta="http://techco.com/db/record/meta";

declare function local:test-case($nodes as node()*) as node()* {
let $pl := for $node in $nodes
            let $ANumber        := $node/db:Record/meta:Metadata/meta:ANumber
            let $ActiveFlag             := $node/db:Record/meta:Metadata/meta:ActiveFlag
            let $value:=   fn:string-join(($ANumber,$ActiveFlag)," ")                                         
              return $value

return $pl
};

let $query:=cts:and-query((
                    ....
        ))

let $value := cts:search(
                   fn:doc(),
                   $query
)
  return local:test-case($value)

1 个答案:

答案 0 :(得分:4)

因此,由于没有示例数据,所以我无法对此进行测试,但这应该可以正常工作。问题是您的返回类型设置为node(),需要为xs:string* 强制无效: 错误表示获取的数据类型与期望的数据类型不同。

xquery version "1.0-ml";
declare namespace techco="http://techco.com/db/record";
declare namespace meta="http://techco.com/db/record/meta";

declare function local:test-case($nodes as node()*) as xs:string* {
let $pl := for $node in $nodes
            let $ANumber        := $node/db:Record/meta:Metadata/meta:ANumber
            let $ActiveFlag             := $node/db:Record/meta:Metadata/meta:ActiveFlag
            let $value:=   fn:string-join(($ANumber,$ActiveFlag)," ")                                         
              return $value

return $pl
};

let $query:=cts:and-query((
                    ....
        ))

let $value := cts:search(
                   fn:doc(),
                   $query
)
  return local:test-case($value)