通过更改属性对元素进行分组

时间:2014-06-24 10:23:25

标签: xquery

我正在尝试通过更改属性对元素进行分组,这可以通过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>

1 个答案:

答案 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'条目