3

XQuery中有没有办法做类似tail()函数的事情?

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

谢谢你。

4

3 回答 3

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)
};
于 2011-05-07T07:56:52.307 回答
1

一个纯粹而简短的 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)
于 2011-05-07T16:40:42.293 回答
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()]

在这里,我使用换行符和回车符作为我的令牌拆分器。如果你需要其他东西来标记你可以。但是简单的日志文件拖尾那么这个解决方案可以正常工作。

给定的示例尾部是给定文件的最后 2 行。如果您想要的不仅仅是将 fn:last()-2 更改为 fn:last() - x

于 2011-05-08T14:38:12.553 回答