Who are you calling generic?: �Using Generic XML normalization rules for ETDs in Primo VE
Elliot Williams, Metadata Strategist
University of Texas at San Antonio
Ex Libris Southcentral Users Group (ELSUG), Dec 6, 2024
Background
Quick Overview of Harvesting External Records in Primo VE
External System
Discovery Import Profile harvests records
Normalization Rules transform records to Primo structure
Records are searchable in Primo
Quick Overview of Harvesting External Records in Primo VE
External System
Discovery Import Profile harvests records
Normalization Rules transform records to Primo structure
Records are searchable in Primo
Discovery import profile
Dublin Core vs Generic XML Normalization
DUBLIN CORE
GENERIC XML
DSpace in Primo
DSpace XOAI metadata
Example: Thesis Advisors & Committee Members
<dc:contributor>Ahmed, Sara</dc:contributor>
<dc:contributor>Jin, Yufang</dc:contributor>
<dc:contributor>Cao, Yongcan</dc:contributor>
<dc:contributor>Alamaniotis, Miltos</dc:contributor>
<dc:contributor>Ramasubramanian, Deepak</dc:contributor>
<element name="contributor">� <element name="advisor">� <element name="none">� <field name="value">Ahmed, Sara</field>� </element>� </element>� <element name="committeeMember">
<element name="none">
<field name="value">Jin, Yufang</field>
<field name="value">Cao, Yongcan</field>
<field name="value">Alamaniotis, Miltos</field>
<field name="value">Ramasubramanian, Deepak</field> </element>�</element>
Example: Thesis Advisors & Committee Members
Generic XML normalization rules:
Then do the same thing for Committee Members.
(The normalization rules couldn’t loop through all of the advisor and committee member elements, so I had to add 8 rules for committee member and 2 for advisor.)
Example: Thesis Advisors & Committee Members
// ADVISORS & COMMITTEE MEMBERS
// Concatenate with display label, and add to local display field 3 (General Note).
// Need to have one rule for each possible instance of each field (up to 8 cmte members and 2 advisors). Rules are in inverse order here, so they will display in same order as DSpace.
rule "advisor note 2"
when
exist "//*[local-name()='record']/*[local-name()='metadata']/*[local-name()='metadata']/*[local-name()='element']/*[local-name()='element'][@name='contributor']/*[local-name()='element'][@name='advisor']/*[local-name()='element']/*[local-name()='field'][@name='value'][2]"
then
copy "concat('Advisor: ',//*[local-name()='record']/*[local-name()='metadata']/*[local-name()='metadata']/*[local-name()='element']/*[local-name()='element'][@name='contributor']/*[local-name()='element'][@name='advisor']/*[local-name()='element']/*[local-name()='field'][@name='value'][2])" to "discovery"."local3"
end
Looks for “advisor” element that is under “contributor” element
This rule is for the 2nd instance of this element – there are similar rules for the first instance.
Uses “concat” to add a string to the value of advsitor, and adds that to local field 3
Example: Thesis Advisors & Committee Members
Using Dublin Core:
Using Generic XML:
Example: Degree information
<element name="thesis">� <element name="degree">� <element name="department">� <element name="none">� <field name="value">Electrical and Computer Engineering</field>� </element>� </element>� </element>� <element name="name">� <element name="none">� <field name="value">Doctor of Philosophy</field>� </element>� </element>
</element>
Dissertation (Doctor of Philosophy) – University of Texas at San Antonio, Electrical and Computer Engineering, 2023
Example: Degree Information
Looks for degree.level element with a value “Doctoral”
Combines degree.name, degree.grantor, degree.department, and date.issued elements into one string
Challenges and Trade-offs
Epilogue: Where we are now
Useful documentation & examples
Thank you!�elliot.williams@utsa.edu
More Examples of Normalization Rules
Example: Open Access indicator
// OPEN ACCESS INDICATOR
// Only apply when access-status="open.access" (this excludes restricted and embargoed items)
rule "add OA indication"
when
"//*[local-name()='record']/*[local-name()='metadata']/*[local-name()='metadata']/*[local-name()='element'][@name='others']/*[local-name()='element'][@name='access-status']/*[local-name()='field'][@name='value']" equals "open.access"
then
set "Unrestricted online access" in "dcterms"."accessRights"
end
Looks for “access.status” element with value “open.access”
Writes a pre-defined value into the dcterms.accessRights field
Example: ETD Publication Date
<element name="date">� <element name=“available">� <element name="none">� <field name="value">2024-01-25T19:32:03Z</field>
<field name="value">2025-05-24</field>� </element>� </element>� <element name="issued">� <element name="none">� <field name="value">2018</field>� </element>� </element>�</element>
<dc:date> 2024-01-25T19:32:03Z </dc:date>
<dc:date> 2025-05-24 </dc:date>�<dc:date>2018</dc:date>
Example: ETD Publication Date
Example: Abstract vs Description
<element name="description">� <element name="none">
<field name="value"> This item is available only to currently enrolled UTSA students, faculty or staff. </field>
</element>� <element name="abstract">� <element name="none">
<field name="value">Abstract goes here. <field>
</element>� </element>
</element>�
Non-abstract description fields are only one level below the main <element> tag.
Abstract fields are two levels below the main <element> tag.
Example: Abstract vs Description
// DESCRIPTION
// Add any dc.description fields that have a qualifier to dc.description. Currently, this is dc.description.abstract and dc.description.department
rule "dc.description - qualifier"
when
exist "//*[local-name()='record']/*[local-name()='metadata']/*[local-name()='metadata']/*[local-name()='element']/*[local-name()='element'][@name='description']/*[local-name()='element']/*[local-name()='element']"
then
copy "//*[local-name()='record']/*[local-name()='metadata']/*[local-name()='metadata']/*[local-name()='element']/*[local-name()='element'][@name='description']/*[local-name()='element']/*[local-name()='element']/*[local-name()='field'][@name='value']" to "dc"."description"
end
Norm rule looks for two elements below the “description” tag, which is how we know that element has a qualifier (like “abstract”).