【发布时间】:2018-08-30 09:04:51
【问题描述】:
我想在我的 xml 文档中将多个节点(特定节点)包装成一个新的单个节点,然后想插入它。
示例 XML 文档-
<root>
<value1>somevalue</value1>
<value2>somevalue</value2>
<value3>somevalue</value3>
<value4>somevalue</value4>
<value5>Australia</value5>
<value6>India</value6>
<value7>USA</value7>
<value8>somevalue</value8>
<value9>somevalue</value9>
<value10>somevalue</value10>
</root>
由于我的 value5 到 value7 是国家/地区的名称,我想将它们放在同一个父节点。 输出需要如下所示:
输出-
<root>
<value1>somevalue</value1>
<value2>somevalue</value2>
<value3>somevalue</value3>
<value4>somevalue</value4>
<Country>
<value5>Australia</value5>
<value6>India</value6>
<value7>USA</value7>
</Country>
<value8>somevalue</value8>
<value9>somevalue</value9>
<value10>somevalue</value10>
</root>
同样,如果我的其他值属于其他一些字段/属性,那么我想将它们包装在一个新的单个节点中。
有什么建议吗?
【问题讨论】:
-
您要用于分组/包装的国家/地区名称列表是否已知?您是否只想对那些相邻的元素进行分组,就像在您的示例中一样,还是将
<value>Australia</value><value>foo</value><value>USA</value>的序列也包装为<Country><value>Australia</value><value>USA</value></Country><value>foo</value>? -
是的,它是已知的(元素或国家名称),它们可以彼此相邻或不能彼此相邻。在我的数据库中,我确实有超过一千个文档,所以很难说这些元素是否总是彼此相邻。
-
为了清楚地描述问题,我们需要知道您是只想用国家值包装相邻元素还是想简单地用国家值包装所有元素,因为第二个选项似乎是一个简单的分组
group by $is-country := $value = $countries而第一个选项最好使用window子句完成。因为我不使用 Marklogic,所以我无法帮助替换它,除了编写一个递归函数来收集序列的尾部,只要它找到国家值然后包装它们。 -
在大部分文件中,我可以看到国家/地区的名称彼此相邻。但是我应该如何在不使用翻滚窗口方法的情况下在 XQuery 中实现这一点。有什么通用的方法吗? Marklogic 确实有类似
xdmp:node-insert-after/xdmp:node-insert-child的 API,但我不确定它们是否对这种情况有用。