首页 > 解决方案 > 使用 XQuery 获取以较小值开头的子节点

问题描述

我想编写一个 XQuery 表达式来获取所有子节点,该子节点以一个子节点开始,其值小于前一个子节点的值,并以最后一个子节点结束。因此,对于下面的示例,我想获得值为 1 和 2 的子节点:

<node>
  <childnode>
    <value>4</value>
  </childnode>
  <childnode>
    <value>8</value>
  </childnode>
  <childnode>
    <value>1</value>
  </childnode>
  <childnode>
    <value>2</value>
  </childnode>
</node>

XQuery 3.1 中最优雅的解决方案是什么?

最好的祝福

标签: xmlxquerybasex

解决方案


tumbling window子句允许表达这一点。

BaseX 中的 XQuery

xquery version "3.1";

declare context item := document {
<node>
  <childnode>
    <value>4</value>
  </childnode>
  <childnode>
    <value>8</value>
  </childnode>
  <childnode>
    <value>1</value>
  </childnode>
  <childnode>
    <value>2</value>
  </childnode>
</node>
};

<root>
{
  for tumbling window $w in /node/childnode
  start $s previous $p when xs:decimal($s/value) lt xs:decimal($p/value)
  return $w
}
</root>

输出

<root>
  <childnode>
    <value>1</value>
  </childnode>
  <childnode>
    <value>2</value>
  </childnode>
</root>

推荐阅读