Record format
Providers publish in whatever their platform emits. Everything is crosswalked to unqualified Dublin Core on ingest; the original payload is retained alongside it and served on request.
<record>
<header>
<identifier>oai:corpus-sync.cloud:4b19f2ac</identifier>
<datestamp>2026-08-24T18:06:11Z</datestamp>
<setSpec>legal-comparative</setSpec>
</header>
<metadata>
<oai_dc:dc>
<dc:title>normalized, whitespace collapsed</dc:title>
<dc:creator>one element per contributor, family-first</dc:creator>
<dc:date>ISO 8601, year granularity when day is absent</dc:date>
<dc:language>ISO 639-3</dc:language>
<dc:identifier>DOI preferred, handle as fallback</dc:identifier>
<dc:source>originating provider</dc:source>
</oai_dc:dc>
</metadata>
</record>
| Source | Format | Target | Note |
|---|---|---|---|
| 245$a $b | MARCXML | dc:title | Subfields joined with a colon |
| 100$a, 700$a | MARCXML | dc:creator | Relator codes dropped |
| 260$c, 264$c | MARCXML | dc:date | Brackets and approximations stripped |
| datacite:titles | DataCite 4 | dc:title | Primary title only |
| datacite:publicationYear | DataCite 4 | dc:date | Year granularity |
| mods:name | MODS 3.7 | dc:creator | Personal names only; corporate go to dc:contributor |
Contributor strings are split on the first comma and reassembled family-first. Initials keep their periods. Nothing is transliterated: names arrive in the script the provider used and stay in it.
Where a provider supplies a range, the earliest year wins and the range is preserved in dc:coverage. Uncertain dates lose their qualifiers, which is lossy and known.
Two records merge when DOIs match, or when title and first creator match after case folding and punctuation removal. Merges are recorded and reversible.
Corrections to the crosswalk are welcome at ops@corpus-sync.cloud.