функция tail() в XQuery

#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