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

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

3 голосов
/ 06 мая 2011

Есть ли способ в XQuery сделать что-то вроде tail() функции?

Что я пытаюсь сделать, это получить содержимое файла (используя " xdmp: fileystem-file ($ path)") и затем отображать только последние 100 строк.Я не могу найти хороший способ сделать это.Есть идеи?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 07 мая 2011

В простом XQuery это может быть достигнуто путем разбиения на строки и получения нужного количества строк в конце последовательности, а затем, если необходимо, соединения их, то есть

declare function local:tail($content as xs:string, $number as xs:integer)
{
  let $linefeed := "
"
  let $lines := tokenize($content, $linefeed)
  let $tail := $lines[position() > last() - $number]
  return string-join($tail, $linefeed)
};
1 голос
/ 07 мая 2011

Чистое и короткое решение XPath 2.0 - может использоваться не только в XQuery, но и в XSLT или на любом другом PL-хостинге XPath 2.0:

for $numLines in count(tokenize(., '
'))
  return
    tokenize(., '
')[position() gt $numLines -100]

или:

for $numLines in count(tokenize(., '
'))
 return
    subsequence(tokenize(., '
'), $numLines -100 +1)
0 голосов
/ 08 мая 2011

если ваш xdmp: file-xx является текстовым файлом, то вы можете использовать что-то вроде

let $f := 'any file system path'
return fn:tokenize(xdmp:filesystem-file($f), '[\n\r]+')[ fn:last() - 2 to fn:last()]

, здесь я использовал перевод строки и возврат каретки в качестве моего сплиттера токенов.если вам нужно что-то еще, чтобы токенизировать, вы можете.но простое отслеживание файла журнала, тогда это решение работает нормально.

данный пример завершает последние 2 строки данного файла.если вы хотите больше, чем изменить fn: last () - от 2 до fn: last () - x

...