2015-06-18 47 views
0

我有如下方式的数据。使用Marklogic Xquery数据填充

<Status>Active Leave Terminated</Status> 
<date>05/06/2014 09/10/2014 01/10/2015</date> 

我想按照下面的方式获取数据。

<status>Active</Status> 
<date>05/06/2014</date> 

<status>Leave</Status> 
<date>09/10/2014</date> 

<status>Terminated</Status> 
<date>01/10/2015</date> 

请帮助我查询,检索上面指定的数据。

+2

请注意,你应该_always_显示你已经尝试过!我这次回答,但一般社区不赞赏这样的问题。尽管如此,欢迎来到SO! – dirkk

回答

3

那么,你有一个字符串,并希望将它拆分成白色的外壳。这就是tokenize()是和\s是一个空白。要获得相应的日期,您可以使用at获取for循环中的当前位置。一起看起来是这样的(请注意,我假设输入数据是当前上下文项):

let $dates := tokenize(date, "\s+") 
for $status at $pos in tokenize(Status, "\s+") 
return (
    <status>{$status}</status>, 
    <date>{$dates[$pos]}</date> 
) 
1

你没有说明你的数据是否是文件系统或已装入MarkLogic。目前还不清楚这是否是您需要对一小部分数据进行一次处理,或者持续处理大量数据。

如果它位于文件系统上,则可以在加载它时将其转换。例如,MarkLogic Content Pump can apply a transformation during load

如果您已经加载了内容,并且想要对其进行转换,则可以使用Corb2

如果您有少量数据,那么您可以使用查询控制台在它之间循环。

无论您如何应用转换代码,dirkk的答案都会显示您需要如何更改转换代码。如果您正在更新数据库中已有的内容,则会将xdmp:node-delete()原始的Status和date元素和xdmp:node-insert-child()添加到新的。