-
Notifications
You must be signed in to change notification settings - Fork 0
/
manuscripts.xquery
76 lines (68 loc) · 4.47 KB
/
manuscripts.xquery
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
import module namespace bod = "http://www.bodleian.ox.ac.uk/bdlss" at "lib/msdesc2solr.xquery";
declare namespace tei="http://www.tei-c.org/ns/1.0";
declare option saxon:output "indent=yes";
<add>
{
let $collection := collection('../collections/?select=*.xml;recurse=yes')
let $msids := $collection/tei:TEI/@xml:id/data()
return if (count($msids) ne count(distinct-values($msids))) then
let $duplicateids := distinct-values(for $msid in $msids return if (count($msids[. eq $msid]) gt 1) then $msid else '')
return bod:logging('error', 'There are multiple manuscripts with the same xml:id in their root TEI elements', $duplicateids)
else
for $x in $collection
let $msid := $x//tei:TEI/@xml:id/string()
return
if (string-length($msid) ne 0) then
let $subfolders := string-join(tokenize(substring-after(base-uri($x), 'collections/'), '/')[position() lt last()], '/')
let $htmlfilename := concat($msid, '.html')
let $htmldoc := doc(concat("html/", $subfolders, '/', $htmlfilename))
let $shelfmarkidno := (
$x//tei:msDesc/tei:msIdentifier/tei:idno[@type="shelfmark"],
$x//tei:msDesc/tei:msIdentifier/tei:idno[not(@type)],
$x//tei:msDesc/tei:msIdentifier/tei:idno
)[1]
let $languages2index := ('en','ar','ka','ka-Latn-x-lc','en-Latn-x-lc')
(:
Guide to Solr field naming conventions:
ms_ = manuscript index field
_i = integer field
_b = boolean field
_s = string field (tokenized)
_t = text field (not tokenized)
_?m = multiple field (typically facets)
*ni = not indexed (except _tni fields which are copied to the fulltext index)
:)
return <doc>
<field name="type">manuscript</field>
<field name="pk">{ $msid }</field>
<field name="id">{ $msid }</field>
<field name="filename_sni">{ base-uri($x) }</field>
{ bod:one2one($x//tei:msDesc/tei:msIdentifier/tei:collection, 'ms_collection_s', 'Not specified') }
{ bod:one2one($shelfmarkidno, 'ms_shelfmark_s') }
{ bod:one2one($shelfmarkidno, 'ms_shelfmark_sort') }
{ bod:one2one($shelfmarkidno, 'title', 'error') }
{ bod:many2one($x//tei:msDesc/tei:msIdentifier/tei:repository, 'ms_repository_s') }
{ bod:many2many($x//tei:msContents/tei:msItem/tei:author/tei:persName, 'ms_authors_sm') }
{ bod:many2many($x//tei:sourceDesc//tei:name[@type="corporate"]/tei:persName, 'ms_corpnames_sm') }
{ bod:many2many($x//tei:sourceDesc//tei:persName, 'ms_persnames_sm') }
{ bod:many2many($x//tei:physDesc//tei:extent, 'ms_extents_sm') }
{ bod:many2many($x//tei:physDesc//tei:layout, 'ms_layout_sm') }
{ bod:many2many($x//tei:msContents/tei:msItem/tei:note, 'ms_notes_sm') }
{ bod:many2many($x//tei:msDesc/tei:head, 'ms_summary_s') }
{ bod:many2many($x//tei:msContents/tei:msItem/tei:title, 'ms_works_sm') }
{ for $lang in $languages2index
return bod:many2many($x//tei:msContents/tei:msItem/tei:title[@xml:lang = $lang], concat('ms_works_', $lang, '_sm'))
}
{ bod:materials($x//tei:msDesc//tei:physDesc//tei:supportDesc[@material], 'ms_materials_sm', 'Not specified') }
{ bod:physForm($x//tei:physDesc/tei:objectDesc, 'ms_physform_sm', 'Not specified') }
{ bod:languages($x//tei:sourceDesc//tei:textLang, 'lang_sm', 'Not specified') }
{ bod:centuries($x//tei:origin//tei:origDate, 'ms_date_sm', 'Undated') }
{ bod:years($x//tei:origin//tei:origDate) }
{ bod:requesting($x/tei:TEI) }
{ bod:indexHTML($htmldoc, 'ms_textcontent_tni') }
{ bod:displayHTML($htmldoc, 'display') }
</doc>
else
bod:logging('warn', 'Cannot process manuscript without @xml:id for root TEI element', base-uri($x))
}
</add>