Получение дочерних узлов, начинающихся с меньшего значения с XQuery - PullRequest
1 голос
/ 05 марта 2020

Я хотел бы написать выражение 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 для этого является наиболее элегантным?

С уважением

Ответы [ 2 ]

3 голосов
/ 05 марта 2020

Предложение tumbling window позволяет выразить это.

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

Вывод

<root>
  <childnode>
    <value>1</value>
  </childnode>
  <childnode>
    <value>2</value>
  </childnode>
</root>
1 голос
/ 05 марта 2020
<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)
...