xquery version "1.0"; declare namespace session="http://exist-db.org/xquery/session"; declare namespace request="http://exist-db.org/xquery/request"; declare namespace util="http://exist-db.org/xquery/util"; declare namespace i18n="http://apache.org/cocoon/i18n/2.1"; import module namespace ristenutil="http://www.risten.no/shared/util" at "../xquery/ristenutil.xqm"; import module namespace buildquery="http://www.risten.no/shared/xqueryfactory" at "../xquery/xqueryfactory.xqm"; declare option exist:serialize "expand-xincludes=no"; declare function local:filter-expr($entry as xs:string, $lang as xs:string) as xs:string { let $infl := request:get-parameter("infl", "") let $expr := if ($infl = "all") then concat ("//entry[matches(@id, '", $entry ,"')]" ) else if ($entry = "*" or string-length($entry) = 0) then concat ("//entry[infl/@lexc &= '", $infl, "']") else concat ("//entry[infl/@lexc &= '", $infl, "'][matches(@id, '", $entry ,"')]") return $expr }; declare function local:build-query($entry as xs:string, $lang as xs:string) as xs:string { let $expr := local:filter-expr($entry, $lang), $coll := ristenutil:get-collection() return if ($lang = "all") then concat("for $r in doc('", $coll, "/termcenter.xml')", $expr, "return $r") else let $doc := concat($coll, "/terms-", $lang, ".xml") return concat("for $r in doc('", $doc, "')", $expr, "return $r") }; (: Present an overview of query results :) declare function local:displayHitlist($hits as node()+) as element() { let $count := count($hits), $maxp := request:get-parameter("howmany", "10"), $max := if ($maxp eq "all") then $count else $maxp cast as xs:int, $start := request:get-parameter("start", "1") cast as xs:int, $end := if ($start + $max - 1 < $count) then $start + $max - 1 else $count, $lang := string-join(request:get-parameter("showlang","all"), ' '), $collID:= session:get-attribute("collection"), $hyph := request:get-parameter("showhyph", "no") return { for $p in $start to $end let $current := item-at($hits, $p) return $current } }; (: Main function - retrieves some request and session attributes, forks further processing to other defined functions depending on the retrieved values :) declare function local:main() as element()+ { let $term := request:get-parameter("term", ""), (: Does this work for multiple langs? :) (:$lang := request:get-parameter("showlang", ""), :) (: This should work better, if there hasn't been a bugfix in eXist :) $lang := string-join(request:get-parameter("showlang","all"), ' '), $previous := session:get-attribute("results"), $queryOld := session:get-attribute("query"), $session := session:get-attribute-names(), $request := request:get-parameter-names(), $collID := if ( request:get-parameter("collection", "") ) then request:get-parameter("collection", "") else session:get-attribute("collection") let $infl := request:get-parameter("infl", "") return if ( string-length($term) = 0 and string-length($infl) = 0) then if (exists($previous)) then (
, local:displayHitlist($previous) ) else

Your query has timed out, or was too unspecific. Please hit the «Find» button again, or enter a new search query.

else if ($term = "*" and $infl = "all") then

Sorry, you cannot search for the whole db. Please enter a slightly more specific search - adding one character is enough.

else let $doc := ristenutil:get-doc($collID,$lang), $query := local:build-query($term, $lang), $hits := util:eval( $query ), $s := session:set-attribute("results", $hits), $t := session:set-attribute("query", $query) return if (empty($hits)) then (

NoHit «{$term}» !
Document: «{$doc}»
Query: «{$query}»

,
) else ( (: DEBUG info:

UrSrchTrm: «{$term}»!
Document: «{$doc}»
Request: «{$request}»
Query: «{$query}»

, :)
,
, Download XML source of hits,
, Download LexC lexicon of hits, local:displayHitlist($hits) (: TODO :) ) };