2011-05-06 26 views
3

XQuery有没有办法像tail()这样的函数?XQuery中的tail()函数

我试图做到的是(使用“xdmp:文件系统文件($ PATH)”)来获取文件的内容,然后只显示最后100行。我似乎无法找到一个好办法做到这一点。有任何想法吗?

谢谢。

+0

好问题,+1。查看我对两种不同的纯XPath 2.0解决方案的回答,这些解决方案比XQuery特定的解决方案更具可移植性和可用性。 :) – 2011-05-07 16:45:48

回答

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

纯和短路来实现

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

或者: - 的XPath 2.0解决方案不仅可以在XQuery的,但在XSLT或任何其他PL托管的XPath 2.0使用

for $numLines in count(tokenize(., '
')) 
return 
    subsequence(tokenize(., '
'), $numLines -100 +1) 
0

如果您xdmp:文件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