XQuery 中是否有办法执行类似tail()
功能的操作?
我想要完成的是获取文件的内容(使用“ xdmp:filesystem-file($ path)”),然后只显示最后100行。我似乎无法找到一个好方法来做到这一点。有什么想法吗?
谢谢。
答案 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