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

Xquery 通过更改属性对元素进行分组,xquery,Xquery,我试图通过更改属性来对元素进行分组,这可以通过XQuery 3.0滚动窗口轻松完成,但我仅限于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

我试图通过更改属性来对元素进行分组,这可以通过XQuery 3.0滚动窗口轻松完成,但我仅限于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循环在XQuery1.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>
{
对于文档中的$changeNode(“Untitled4.xml”)//root/value
其中$changeNode[@attr=“a”和前面的::value[@attr!=“a”]]
返回
{
对于$changeNode/following::value中的$sameNode
其中$sameNode[@attr=“a”]
返回$sameNode
}
}
其结果是:

<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>

不确定这是否是最干净的解决方案,但这应该有效:为每个组选择起始节点,然后选择以下所有节点,并删除不应在此组中的节点:

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>
$start in//value[(不是(前面的::value)或前面的::value[1]/@attr!=@attr)和@attr='a'] 返回 { 对于($start,$start/following::value[@attr=$start/@attr])中的$item,除了($start/following::value[@attr!=$start/@attr]/following::value) 退货$item }
编辑:刚刚注意到您只需要“a”条目

为什么要删除第一个问题?这是一个相当烦人的行为,不受欢迎,因为答案也在这里帮助别人!为什么你不简单地修改一下,你的答案限制在1.0,我会相应地编辑我的答案(其他人也会这样做)?简单地删除你的问题并再次问“某个人”不是很有建设性。而且,正如你在旧的(现在已删除的)问题中声称你找到了解决方案,我想知道你为什么还要问?!我没有办法。我忘了对“XQuery 1.0”进行限制。这就是为什么我说您可以简单地编辑您的原始问题。这样,我的答案就被简单地删除了,坦率地说,这很烦人,因为你当然可以理解,我写答案需要时间,而且它本可以帮助其他人。同时提供XQuery 1.0的答案并不是什么问题,但由于您只是简单地将问题连同答案一起删除,我不愿意投入更多的时间。简言之:由于您是SO新手,请在“帮助”部分熟悉SO的工作原理。这对真正得到答案至关重要。谢谢,它很有效。我很想提高投票率,但声望不够。不过你应该能够接受答案:P(我认为)