XQuery中的tail()函数

时间:2011-05-06 19:41:50

标签: function xquery tail marklogic

XQuery 中是否有办法执行类似tail()功能的操作?

我想要完成的是获取文件的内容(使用“ xdmp:filesystem-file($ path)”),然后只显示最后100行。我似乎无法找到一个好方法来做到这一点。有什么想法吗?

谢谢。

3 个答案:

答案 0 :(得分:4)

在简单的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 :(得分:1)

纯粹而简短的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)

答案 2 :(得分:0)

如果您的xdmp:file-xx是文本文件的本质,那么您可以使用类似

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

这里   我使用过newline&回车作为我的令牌分配器。如果你需要别的东西来代替你的话。但简单的日志文件拖尾然后这个解决方案工作正常。

给出示例尾部给定文件的最后2行。如果你想要更多改变fn:last() - 2到fn:last() - x