Два простых способа сделать это в XQuery. Оба полагаются на возможность присвоить последовательность значений переменной, чтобы мы могли смотреть на пары отдельных ее членов, когда нам нужно.
Сначала просто перебирайте значения и выберите (a) первое значение, (b) любое значение, которое не больше, чем его предшественник, и (c) любое значение, которое не меньше его преемника. [OP указывает, что последнее значение также необходимо включить; оставил упражнение для читателя. Или см. Ответ Майкла Кей, в котором приведена формулировка фильтра; Закон де Моргана ударяет снова]
let $vseq := (1,2,3,4,5,6,7,14,15,16,17,24,25,26,27,28)
for $v at $pos in $vseq
return if ($pos eq 1
or $vseq[$pos - 1] ne $v - 1
or $vseq[$pos + 1] ne $v + 1)
then $v
else()
Или, во-вторых, делать примерно то же самое в выражении фильтра:
let $vseq := (1,2,3,4,5,6,7,14,15,16,17,24,25,26,27,28)
return $vseq[
for $i in position() return
$i eq 1
or . ne $vseq[$i - 1] + 1
or . ne $vseq[$i + 1] - 1]
Основное различие между этими двумя способами выполнения вычисления и вашего нерабочими попытка состоит в том, что они ничего не говорят об изменении или изменении последовательности; они просто задают новую последовательность. Используя выражение фильтра, вторая формулировка ясно показывает, что результатом будет подпоследовательность $ vseq; выражение for
вообще не дает такой гарантии (хотя, поскольку для каждого значения оно возвращает либо пустую последовательность, либо само значение, мы можем видеть, что здесь тоже результат будет подпоследовательностью: копией $ vseq, из которой были получены некоторые значения опущено.
Многие программисты трудно перестать думать в терминах присваивания переменным или модификации структуры данных, но его стоит некоторых усилий.
[Приложение] Я может быть видом что-то, но я не см. способ выражения этого вычисления в чистом XPath 2.0, поскольку XPath 2.0, похоже, не имеет какого-либо механизма, который может связывать переменную типа $vseq
с не-одиночной последовательностью значений (XPath 3.0 имеет выражения let
, так что это не проблема. Вторая формулировка выше самая чистая XPath 3.0)
Всегда обеспечивайте _specific проблемы statement_, описать, где вы застряли. «failed» не является разумным описанием проблемы, вы получаете сообщение об ошибке, вы получаете неправильный вывод, ...? –
Простой застрял в функциональной части без гражданства .. :) –