1
votes

In eXist-db I have hundreds of documents in /db/apps/foo/resources/documents like so:

...
BNF9992-J305-1.xml
BNF9992-J305-5.xml
BNF9992-J308-9.xml
BNF9992-J310-8.xml
BNF9992-J311-1.xml
BNF9992-J312-6.xml
BNF9992-J312-7.xml
BNF9992-J315-9.xml
BNF9992-J316-2.xml
BNF9992-J317-2.xml
BNF9992-J319-3.xml
...

Imagine I want to present to the user a list of 3 documents appearing before and after a specific document (based on alpha-numeric sort). So, my 'current document' is BNF9992-J312-7.xml, and I want to show the user something like:

BNF9992-J310-8.xml
BNF9992-J311-1.xml
BNF9992-J312-6.xml
BNF9992-J312-7.xml (current document)
BNF9992-J315-9.xml
BNF9992-J316-2.xml
BNF9992-J317-2.xml

Is there a function/method in Xquery 3.1 for iterating up/down a list of documents once they've been retrieved. The most I've been able to do is a simple retrieval of document names from a collection:

 for $resource in collection("/db/apps/foo/resources/documents")
 let $uri := base-uri($resource)
 return util:unescape-uri(replace($uri, ".+/(.+)$","$1"), "UTF-8")

But I don't know how to iterate up and down the list from a given document.

Perhaps writing the list into nodes and applying a formula to node ordinals?

Many thanks.

1

1 Answers

2
votes

If this were a list of strings $list, and the "current string" is $s, then I would do

let $i := index-of($list, $s)
return subsequence($list, $i - 3, 7)

I'm not sure whether the fact that you have a list of documents (rather than strings) changes this.