Skip to content

Commit 4ecea44

Browse files
luis100claude
andcommitted
feat(emailarchive): add title/level to ingest XSLT and HTML dissemination crosswalk
Ingest XSLT now emits `title` (custodian name, emailAddress as fallback) and a fixed `level = item` so emailarchive AIPs display correctly in the browse list alongside other AIP types. New HTML dissemination crosswalk renders all mailbox-level fields with i18n labels and shows the indexed email messages as a compact table (subject, sender, sent date, folder). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 1d4153b commit 4ecea44

3 files changed

Lines changed: 142 additions & 0 deletions

File tree

roda-core/roda-core/src/main/resources/config/crosswalks/ingest/emailarchive.xslt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,22 @@
1414

1515
<xsl:template match="*:emailArchive">
1616
<!-- Mailbox-level fields (parent AIP) -->
17+
18+
<!-- title: custodian name used as primary display title; emailAddress as fallback -->
19+
<xsl:choose>
20+
<xsl:when test="normalize-space(*:custodian/text()) != ''">
21+
<field name="title"><xsl:value-of select="normalize-space(*:custodian/text())"/></field>
22+
<field name="title_txt"><xsl:value-of select="normalize-space(*:custodian/text())"/></field>
23+
</xsl:when>
24+
<xsl:when test="normalize-space(*:emailAddress/text()) != ''">
25+
<field name="title"><xsl:value-of select="normalize-space(*:emailAddress/text())"/></field>
26+
<field name="title_txt"><xsl:value-of select="normalize-space(*:emailAddress/text())"/></field>
27+
</xsl:when>
28+
</xsl:choose>
29+
30+
<!-- level is always "item" for an email mailbox archive -->
31+
<field name="level">item</field>
32+
1733
<xsl:if test="normalize-space(*:custodian/text()) != ''">
1834
<field name="custodian_txt"><xsl:value-of select="normalize-space(*:custodian/text())"/></field>
1935
</xsl:if>
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<xsl:stylesheet version="2.0"
3+
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4+
xmlns:ea="https://roda-community.org/schemas/emailarchive/v1"
5+
exclude-result-prefixes="ea">
6+
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>
7+
8+
<xsl:param name="i18n.custodian"/>
9+
<xsl:param name="i18n.emailAddress"/>
10+
<xsl:param name="i18n.dateStart"/>
11+
<xsl:param name="i18n.dateEnd"/>
12+
<xsl:param name="i18n.totalMessages"/>
13+
<xsl:param name="i18n.originalFormat"/>
14+
<xsl:param name="i18n.archivingMotive"/>
15+
<xsl:param name="i18n.emails"/>
16+
<xsl:param name="i18n.emails.messageId"/>
17+
<xsl:param name="i18n.emails.subject"/>
18+
<xsl:param name="i18n.emails.sender"/>
19+
<xsl:param name="i18n.emails.recipients"/>
20+
<xsl:param name="i18n.emails.sentDate"/>
21+
<xsl:param name="i18n.emails.folderPath"/>
22+
<xsl:param name="i18n.emails.hasAttachments"/>
23+
24+
<xsl:template match="/">
25+
<div class="descriptiveMetadata">
26+
<xsl:apply-templates/>
27+
</div>
28+
</xsl:template>
29+
30+
<xsl:template match="*:emailArchive">
31+
<xsl:if test="normalize-space(*:custodian/text()) != ''">
32+
<div class="field">
33+
<div class="label"><xsl:value-of select="$i18n.custodian"/></div>
34+
<div class="value"><xsl:value-of select="normalize-space(*:custodian/text())"/></div>
35+
</div>
36+
</xsl:if>
37+
<xsl:if test="normalize-space(*:emailAddress/text()) != ''">
38+
<div class="field">
39+
<div class="label"><xsl:value-of select="$i18n.emailAddress"/></div>
40+
<div class="value"><xsl:value-of select="normalize-space(*:emailAddress/text())"/></div>
41+
</div>
42+
</xsl:if>
43+
<xsl:if test="normalize-space(*:dateStart/text()) != ''">
44+
<div class="field">
45+
<div class="label"><xsl:value-of select="$i18n.dateStart"/></div>
46+
<div class="value"><xsl:value-of select="normalize-space(*:dateStart/text())"/></div>
47+
</div>
48+
</xsl:if>
49+
<xsl:if test="normalize-space(*:dateEnd/text()) != ''">
50+
<div class="field">
51+
<div class="label"><xsl:value-of select="$i18n.dateEnd"/></div>
52+
<div class="value"><xsl:value-of select="normalize-space(*:dateEnd/text())"/></div>
53+
</div>
54+
</xsl:if>
55+
<xsl:if test="normalize-space(*:totalMessages/text()) != ''">
56+
<div class="field">
57+
<div class="label"><xsl:value-of select="$i18n.totalMessages"/></div>
58+
<div class="value"><xsl:value-of select="normalize-space(*:totalMessages/text())"/></div>
59+
</div>
60+
</xsl:if>
61+
<xsl:if test="normalize-space(*:originalFormat/text()) != ''">
62+
<div class="field">
63+
<div class="label"><xsl:value-of select="$i18n.originalFormat"/></div>
64+
<div class="value"><xsl:value-of select="normalize-space(*:originalFormat/text())"/></div>
65+
</div>
66+
</xsl:if>
67+
<xsl:if test="normalize-space(*:archivingMotive/text()) != ''">
68+
<div class="field">
69+
<div class="label"><xsl:value-of select="$i18n.archivingMotive"/></div>
70+
<div class="value prewrap"><xsl:value-of select="normalize-space(*:archivingMotive/text())"/></div>
71+
</div>
72+
</xsl:if>
73+
74+
<xsl:if test="count(*:email) &gt; 0">
75+
<div class="field">
76+
<div class="label"><xsl:value-of select="$i18n.emails"/></div>
77+
<div class="value">
78+
<table class="table-condensed emailarchive-messages">
79+
<thead>
80+
<tr>
81+
<th><xsl:value-of select="$i18n.emails.subject"/></th>
82+
<th><xsl:value-of select="$i18n.emails.sender"/></th>
83+
<th><xsl:value-of select="$i18n.emails.sentDate"/></th>
84+
<th><xsl:value-of select="$i18n.emails.folderPath"/></th>
85+
</tr>
86+
</thead>
87+
<tbody>
88+
<xsl:for-each select="*:email">
89+
<tr>
90+
<td>
91+
<xsl:choose>
92+
<xsl:when test="normalize-space(*:subject/text()) != ''">
93+
<xsl:value-of select="normalize-space(*:subject/text())"/>
94+
</xsl:when>
95+
<xsl:otherwise>—</xsl:otherwise>
96+
</xsl:choose>
97+
</td>
98+
<td><xsl:value-of select="normalize-space(*:sender/text())"/></td>
99+
<td><xsl:value-of select="normalize-space(*:sentDate/text())"/></td>
100+
<td><xsl:value-of select="normalize-space(*:folderPath/text())"/></td>
101+
</tr>
102+
</xsl:for-each>
103+
</tbody>
104+
</table>
105+
</div>
106+
</div>
107+
</xsl:if>
108+
</xsl:template>
109+
110+
</xsl:stylesheet>

roda-ui/roda-wui/src/main/resources/config/i18n/ServerMessages.properties

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,22 @@ crosswalks.dissemination.html.dc_simpledc20021212.source=Source
587587
crosswalks.dissemination.html.dc_simpledc20021212.subject=Subject
588588
crosswalks.dissemination.html.dc_simpledc20021212.type=Type
589589

590+
crosswalks.dissemination.html.emailarchive.custodian=Custodian
591+
crosswalks.dissemination.html.emailarchive.emailAddress=Email address
592+
crosswalks.dissemination.html.emailarchive.dateStart=Date range start
593+
crosswalks.dissemination.html.emailarchive.dateEnd=Date range end
594+
crosswalks.dissemination.html.emailarchive.totalMessages=Total messages
595+
crosswalks.dissemination.html.emailarchive.originalFormat=Original format
596+
crosswalks.dissemination.html.emailarchive.archivingMotive=Archiving motive
597+
crosswalks.dissemination.html.emailarchive.emails=Messages
598+
crosswalks.dissemination.html.emailarchive.emails.messageId=Message ID
599+
crosswalks.dissemination.html.emailarchive.emails.subject=Subject
600+
crosswalks.dissemination.html.emailarchive.emails.sender=Sender
601+
crosswalks.dissemination.html.emailarchive.emails.recipients=Recipients
602+
crosswalks.dissemination.html.emailarchive.emails.sentDate=Sent date
603+
crosswalks.dissemination.html.emailarchive.emails.folderPath=Folder
604+
crosswalks.dissemination.html.emailarchive.emails.hasAttachments=Has attachments
605+
590606
crosswalks.dissemination.html.event.identifierType: Identifier type
591607
crosswalks.dissemination.html.event.identifierValue: Identifier value
592608
crosswalks.dissemination.html.event.dateTime: Date

0 commit comments

Comments
 (0)