-
-
Notifications
You must be signed in to change notification settings - Fork 33
/
index.xql
102 lines (96 loc) · 4.24 KB
/
index.xql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
xquery version "3.1";
module namespace idx="http://teipublisher.com/index";
declare namespace tei="http://www.tei-c.org/ns/1.0";
declare namespace dbk="http://docbook.org/ns/docbook";
declare variable $idx:app-root :=
let $rawPath := system:get-module-load-path()
return
(: strip the xmldb: part :)
if (starts-with($rawPath, "xmldb:exist://")) then
if (starts-with($rawPath, "xmldb:exist://embedded-eXist-server")) then
substring($rawPath, 36)
else
substring($rawPath, 15)
else
$rawPath
;
(:~
: Helper function called from collection.xconf to create index fields and facets.
: This module needs to be loaded before collection.xconf starts indexing documents
: and therefore should reside in the root of the app.
:)
declare function idx:get-metadata($root as element(), $field as xs:string) {
let $header := $root/tei:teiHeader
return
switch ($field)
case "title" return
string-join((
$header//tei:msDesc/tei:head, $header//tei:titleStmt/tei:title[@type = 'main'],
$header//tei:titleStmt/tei:title,
$root/dbk:info/dbk:title,
root($root)//article-meta/title-group/article-title,
root($root)//article-meta/title-group/subtitle
), " - ")
case "author" return (
$header//tei:correspDesc/tei:correspAction/tei:persName,
$header//tei:titleStmt/tei:author,
$root/dbk:info/dbk:author,
root($root)//article-meta/contrib-group/contrib/name
)
case "language" return
head((
$header//tei:langUsage/tei:language/@ident,
$root/@xml:lang,
$header/@xml:lang,
root($root)/*/@xml:lang
))
case "date" return head((
$header//tei:correspDesc/tei:correspAction/tei:date/@when,
$header//tei:sourceDesc/(tei:bibl|tei:biblFull)/tei:publicationStmt/tei:date,
$header//tei:sourceDesc/(tei:bibl|tei:biblFull)/tei:date/@when,
$header//tei:fileDesc/tei:editionStmt/tei:edition/tei:date,
$header//tei:publicationStmt/tei:date
))
case "genre" return (
idx:get-genre($header),
root($root)//dbk:info/dbk:keywordset[@vocab="#genre"]/dbk:keyword,
root($root)//article-meta/kwd-group[@kwd-group-type="genre"]/kwd
)
case "category" return
(root($root)/tei:TEI/@n, "ZZZ")[1]
case "feature" return (
idx:get-classification($header, 'feature'),
$root/dbk:info/dbk:keywordset[@vocab="#feature"]/dbk:keyword
)
case "form" return (
idx:get-classification($header, 'form'),
$root/dbk:info/dbk:keywordset[@vocab="#form"]/dbk:keyword
)
case "period" return (
idx:get-classification($header, 'period'),
$root/dbk:info/dbk:keywordset[@vocab="#period"]/dbk:keyword
)
case "content" return (
root($root)//body,
$root/dbk:section
)
case "place" return
($root//tei:placeName/string(), $root//tei:name[@type="place"]/string())
default return
()
};
declare function idx:get-genre($header as element()?) {
let $targets := $header//tei:textClass/tei:catRef[@scheme="#genre"]/@target
return
array:for-each(array {$targets}, function($target) {
let $category := id(substring($target, 2), doc($idx:app-root || "/data/taxonomy.xml"))
return
$category/ancestor-or-self::tei:category[parent::tei:category]/tei:catDesc
})
};
declare function idx:get-classification($header as element()?, $scheme as xs:string) {
for $target in $header//tei:textClass/tei:catRef[@scheme="#" || $scheme]/@target
let $category := id(substring($target, 2), doc($idx:app-root || "/data/taxonomy.xml"))
return
$category/ancestor-or-self::tei:category[parent::tei:category]/tei:catDesc
};