我正在尝试通过更改属性对元素进行分组,这可以通过XQuery 3.0 Tumbling Windows轻松完成,但我仅限于XQuery 1.0。
输入如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<value attr="a" no="1"/>
<value attr="a" no="2"/>
<value attr="b"/>
<value attr="a" no="3"/>
<value attr="b"/>
<value attr="b"/>
<value attr="a" no="4"/>
<value attr="a" no="5"/>
<value attr="b"/>
<value attr="a" no="6"/>
</root>
所需的输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<new>
<value attr="a" no="1"/>
<value attr="a" no="2"/>
</new>
<new>
<value attr="a" no="3"/>
</new>
<new>
<value attr="a" no="4"/>
<value attr="a" no="5"/>
</new>
<new>
<value attr="a" no="6"/>
</new>
</root>
我的第一次尝试是以下,由于嵌套for循环在XQuery 1.0中的工作方式,因此没有返回预期的结果
<root>{
for $changeNode in doc("Untitled4.xml")//root/value
where $changeNode[@attr="a" and preceding::value[@attr!="a"]]
return
<new>{
for $sameNode in $changeNode/following::value
where $sameNode[@attr="a"]
return $sameNode
}</new>
}</root>
结果是:
<root>
<new>
<value attr="a" no="4"/>
<value attr="a" no="5"/>
<value attr="a" no="6"/>
</new>
<new>
<value attr="a" no="5"/>
<value attr="a" no="6"/>
</new>
<new>
<value attr="a" no="6"/>
</new>
<new/>
</root>
答案 0 :(得分:0)
不确定这是否是最干净的解决方案,但这应该有效:选择每个组的起始节点,然后选择所有后续节点并消除不应该在该组中的节点:
for $start in //value[(not(preceding::value) or preceding::value[1]/@attr != @attr) and @attr = 'a']
return
<new>{
for $item in ($start, $start/following::value[@attr = $start/@attr]) except ($start/following::value[@attr != $start/@attr]/following::value )
return $item
}</new>
编辑:只是注意到你只想要'a'条目