使用 XQuery 获取以较小值开始的子节点

Getting childnodes starting with a lesser value with 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 中最优雅的解决方案是什么?

此致

tumbling window 子句允许表达。

XQuery in BaseX

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>

Output

<root>
  <childnode>
    <value>1</value>
  </childnode>
  <childnode>
    <value>2</value>
  </childnode>
</root>
<node>
  <childnode>
    <value>4</value>
  </childnode>
  <childnode>
    <value>8</value>
  </childnode>
  <childnode>
    <value>1</value>
  </childnode>
  <childnode>
    <value>2</value>
  </childnode>
</node>
 /childnode[value lt preceding-sibling::childnode[1]/value][1]
   /(self::childnode|following-sibling::childnode)