#function #xquery #tail #marklogic
#функция #xquery #хвост #marklogic
Вопрос:
Есть ли способ в XQuery сделать что-то вроде tail()
функции?
Чего я пытаюсь достичь, так это получить содержимое файла (используя «xdmp:filesystem-file($ path)«) и затем отобразить только последние 100 строк. Кажется, я не могу найти хороший способ сделать это. Есть идеи?
Спасибо.
Комментарии:
1. Хороший вопрос, 1. Смотрите мой ответ для двух разных решений pure XPath 2.0, которые более переносимы и удобны в использовании, чем решение, специфичное для XQuery. 🙂
Ответ №1:
В обычном XQuery это может быть достигнуто путем разбиения на строки и получения нужного количества строк из конца последовательности, затем воссоединения их, если необходимо, т.Е.
declare function local:tail($content as xs:string, $number as xs:integer)
{
let $linefeed := "amp;#10;"
let $lines := tokenize($content, $linefeed)
let $tail := $lines[position() > last() - $number]
return string-join($tail, $linefeed)
};
Ответ №2:
Чистое и короткое решение XPath 2.0 — может использоваться не только в XQuery, но и в XSLT или в любой другой платформе, на которой размещен XPath 2.0:
for $numLines in count(tokenize(., 'amp;#xA;'))
return
tokenize(., 'amp;#xA;')[position() gt $numLines -100]
Или:
for $numLines in count(tokenize(., 'amp;#xA;'))
return
subsequence(tokenize(., 'amp;#xA;'), $numLines -100 1)
Ответ №3:
если ваш xdmp:file-xx представляет собой текстовый файл, то вы могли бы использовать что-то вроде
let $f := 'any file system path'
return fn:tokenize(xdmp:filesystem-file($f), '[nr] ')[ fn:last() - 2 to fn:last()]
здесь
я использовал перевод строки и возврат каретки в качестве разделителя токенов. если вам нужно что-то еще для токенизации, вы могли бы. но простое хвостирование файла журнала тогда это решение работает нормально.
приведенный пример завершает последние 2 строки данного файла. если вы хотите чего-то большего, чем изменить fn:last() -2 на fn:last() — x