XQuery中有没有办法做类似tail()
函数的事情?
我想要完成的是获取文件的内容(使用“ xdmp:filesystem-file($path) ”),然后只显示最后 100 行。我似乎找不到这样做的好方法。有任何想法吗?
谢谢你。
在普通的 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)
};
一个纯粹而简短的 XPath 2.0 解决方案——不仅可以在 XQuery 中使用,还可以在 XSLT 或任何其他托管 XPath 2.0 的 PL 中使用:
for $numLines in count(tokenize(., '
'))
return
tokenize(., '
')[position() gt $numLines -100]
或者:
for $numLines in count(tokenize(., '
'))
return
subsequence(tokenize(., '
'), $numLines -100 +1)
如果您的 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