【问题标题】:Group elements by a changing attribute按变化的属性对元素进行分组
【发布时间】:2014-06-24 10:23:24
【问题描述】:

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

【问题讨论】:

  • 为什么要删除第一个问题?这是一个非常烦人的行为,在 SO 上不受欢迎,因为答案也在这里帮助他人!您为什么不简单地修改您仅限于 1.0,我会相应地编辑我的答案(就像其他人一样)?简单地删除您的问题并再次询问某个问题不是很有建设性。
  • 另外,正如您在旧(现已删除)的问题中声称您找到了解决方案,我想知道您为什么还要问?!
  • 我没有解决办法。我忘了限制“XQuery 1.0”。
  • 这就是为什么我说您可以简单地编辑您的原始问题。这样一来,我的答案就被简单地删除了,坦率地说,这很烦人,因为您当然可以理解,我实际写答案需要时间,而且它本可以帮助其他人。为 XQuery 1.0 提供答案也不是问题,但由于您只是用他们的答案删除问题,我不愿意投入更多时间。
  • 简而言之:由于您是 SO 新手,请在帮助部分熟悉 SO 的工作原理。这对于实际获得答案至关重要。

标签: xquery


【解决方案1】:

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

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”条目

【讨论】:

  • 谢谢,它只是工作。我很想投票,但没有足够的声誉。
  • 你应该能够接受答案:P(我认为)
猜你喜欢
  • 2017-03-18
  • 1970-01-01
  • 2016-02-21
  • 2017-05-24
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多