CmdiInterop: cmdi_mods.xsl

File cmdi_mods.xsl, 27.3 KB (added by broeder, 10 years ago)

MODS2CMDI transform

Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<xsl:stylesheet xmlns="http://www.clarin.eu/cmd/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4        xmlns:doc="http://www.lyncode.com/xoai"
5        version="1.0">
6
7    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
8
9    <xsl:key name="iso-lookup" match="lang" use="sil"/>
10    <xsl:key name="provider-lookup" match="prov" use="identifier"/>
11
12       
13        <xsl:output omit-xml-declaration="yes" method="xml" indent="yes" />
14        <xsl:variable name="portnumber"><xsl:text>:8080</xsl:text></xsl:variable>
15
16        <xsl:template match="/">
17                <xsl:variable name="itemidentifier">
18                        <xsl:value-of select="doc:metadata/doc:element[@name='others']/doc:field[@name='identifier']/text()"/>
19                </xsl:variable>
20                <xsl:variable name="itempage">
21                        <xsl:value-of select="substring-after($itemidentifier, ':')" /> <!-- grieg.library.uu.nl:1874/1098 -->
22                </xsl:variable>
23                <xsl:variable name="domain">
24                        <xsl:value-of select="substring-before($itempage, ':')" /> <!-- grieg.library.uu.nl -->
25                </xsl:variable>
26                <xsl:variable name="handlepart">
27                        <xsl:value-of select="substring-after($itempage, ':')" /> <!-- 1874/1098 -->
28                </xsl:variable>
29                <xsl:variable name="itempagelink">
30                        <xsl:text>http://</xsl:text>
31                        <xsl:value-of select="$domain" />
32                        <!--<xsl:value-of select="$portnumber" /> add port number -->
33                        <xsl:text>/handle/</xsl:text>
34                        <xsl:value-of select="$handlepart" />
35                </xsl:variable>
36
37
38<!-- see http://www.clarin.eu/faq-page/273#t273n3462 for some stuff on the Resources section -->
39<!-- and see http://www.clarin.eu/node/3014 for an example -->
40        <CMD CMDVersion="1.1" xsi:schemaLocation="http://www.clarin.eu/cmd/ http://catalog.clarin.eu/ds/ComponentRegistry/rest/registry/profiles/clarin.eu:cr1:p_1381926654437/xsd">
41            <Header>
42                <MdCreator>cmdi_mods.xsl</MdCreator>
43                <MdCreationDate>
44                                        <xsl:variable name="longdate">
45                                                <xsl:value-of select="doc:metadata/doc:element[@name='others']/doc:field[@name='lastModifyDate']/text()"/>
46                                        </xsl:variable>
47                                        <xsl:value-of select="substring($longdate,1,10)" />
48                                        <!--<xsl:for-each select="doc:metadata/doc:element[@name='others']/doc:field[@name='lastModifyDate']/text()">
49                                                <xsl:value-of select="." />
50                                        </xsl:for-each>-->
51                </MdCreationDate>
52                <MdSelfLink>
53                                        <xsl:for-each select="doc:metadata/doc:element[@name='others']/doc:field[@name='identifier']/text()">
54                                                <xsl:value-of select="." />
55                                        </xsl:for-each>
56                </MdSelfLink>
57                <MdProfile>clarin.eu:cr1:p_1381926654437</MdProfile>
58                <MdCollectionDisplayName> <!-- or real name of set? -->
59                        UBU Clarin Set
60                </MdCollectionDisplayName>
61            </Header>
62            <Resources>
63                <ResourceProxyList>
64                                        <xsl:variable name="proxyid">
65                                                <xsl:text>h.</xsl:text>
66                                                <xsl:value-of select="translate($handlepart, '/', '.')" />
67                                        </xsl:variable>
68                                        <ResourceProxy id="{$proxyid}">
69                                                <ResourceType mimetype="text/html">LandingPage</ResourceType>
70                                                <ResourceRef>
71                                                                <xsl:value-of select="$itempagelink"/>
72                                                </ResourceRef>
73                                        </ResourceProxy>
74                                       
75                                        <xsl:for-each select="doc:metadata/doc:element[@name='bundles']/doc:element[@name='bundle']">
76                                                <xsl:if test="(doc:field[@name='name']/text() = 'ORIGINAL') or (doc:field[@name='name']/text() = 'CONTENT')">
77                                                        <xsl:for-each select="doc:element[@name='bitstreams']/doc:element">
78                                                                <xsl:variable name="mimetype" select="doc:field[@name='format']/text()"/>
79                                                                <xsl:variable name="bitstreamid" select="doc:field[@name='name']/text()"/>
80                                                                <xsl:variable name="sequenceid" select="doc:field[@name='sid']/text()" />
81                                                                <!-- see if we can find the bitstream sequence id-->
82                                                                <ResourceProxy>
83                                                                        <xsl:attribute name="id">
84                                                                                <xsl:text>h.</xsl:text>
85                                                                                <xsl:value-of select="translate($handlepart, '/', '.')" />
86                                                                                <xsl:text>.</xsl:text>
87                                                                                <!--<xsl:value-of select="translate($bitstreamid, ' ', '.')" />-->
88                                                                                <xsl:value-of select="$sequenceid"/>
89                                                                               
90                                                                        </xsl:attribute>
91                                                                        <ResourceType mimetype="{$mimetype}">Resource</ResourceType>
92                                                                        <ResourceRef>
93                                                                                <xsl:value-of select="doc:field[@name='url']/text()"/>
94                                                                        </ResourceRef>
95                                                                </ResourceProxy>
96                                                        </xsl:for-each>
97                                                </xsl:if>
98                                        </xsl:for-each>
99                </ResourceProxyList>
100                <JournalFileProxyList/>
101                <ResourceRelationList/>
102            </Resources>
103            <Components>
104                                <mods version="3.2">
105
106                                        <edboOverlap>
107                                                <xsl:text>no</xsl:text>
108                                        </edboOverlap>
109                                       
110                                        <machineReadable>
111                                                <xsl:text>unknown</xsl:text>
112                                        </machineReadable>
113
114                                        <!-- CLARIN demands that elements without subelements come first -->
115                                        <!-- type of resource = type.physical; if none is given, use 'text' -->
116                                        <typeOfResource>
117                                                <xsl:choose>
118                                                        <xsl:when test="doc:metadata/doc:element[@name='dc']/doc:element[@name='type']/doc:element[@name='physical']/doc:element/doc:field[@name='value']">
119                                                                <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='type']/doc:element[@name='physical']/doc:element/doc:field[@name='value']/text()" />
120                                                        </xsl:when>
121                                                        <xsl:otherwise>
122                                                                <xsl:text>text</xsl:text>
123                                                        </xsl:otherwise>
124                                                </xsl:choose>
125                                        </typeOfResource>
126                                       
127                                        <!-- genre; type.content plus a mapping-->
128                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='type']/doc:element[@name='content']/doc:element/doc:field[@name='value']">
129                                                <genre>
130                                                        <xsl:text>info:eu-repo/semantics/</xsl:text>
131                                                        <xsl:call-template name="genremapping">
132                                                                <xsl:with-param name="typecontent">
133                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='type']/doc:element[@name='content']/doc:element/doc:field[@name='value']/text()" />
134                                                                </xsl:with-param>
135                                                        </xsl:call-template>
136                                                </genre>
137                                        </xsl:if>
138                       
139                                        <!-- abstract -->
140                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='description']/doc:element[@name='abstract']/doc:element/doc:field[@name='value']">
141                                                <abstract><xsl:value-of select="." /></abstract>
142                                        </xsl:for-each>
143                                       
144                                        <!--audience, if any is given -->
145                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='audience']/doc:element/doc:field[@name='value']">
146                                                <targetAudience>
147                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='audience']/doc:element/doc:field[@name='value']/text()" />
148                                                </targetAudience>
149                                        </xsl:if>
150                                       
151                                        <!--annotation = description.note, if any is given-->
152                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='description']/doc:element[@name='note']/doc:element/doc:field[@name='value']">
153                                                <note>
154                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='description']/doc:element[@name='note']/doc:element/doc:field[@name='value']/text()"/>
155                                                </note>
156                                        </xsl:if>
157                                       
158                                        <!-- classification = subject.discipline-->
159                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='subject']/doc:element[@name='discipline']/doc:element/doc:field[@name='value']">
160                                                <classification>
161                                                        <xsl:value-of select="." />
162                                                </classification>
163                                        </xsl:for-each>
164                                       
165                                        <!-- isbn (if the item is not part of a monograph, isbn is in a different field than if it is) -->
166                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='identifier']/doc:element[@name='isbn']/doc:element/doc:field[@name='value']">
167                                                <identifier>
168                                                        <xsl:attribute name="type"><xsl:text>uri</xsl:text></xsl:attribute>
169                                                        <xsl:text>URN:ISBN:</xsl:text>
170                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='identifier']/doc:element[@name='isbn']/doc:element/doc:field[@name='value']/text()" />
171                                                </identifier>
172                                        </xsl:if>
173                                       
174                                                                                       
175                                        <!-- and now the other elements -->
176                                        <!-- title info -->
177                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='title']/doc:element/doc:field[@name='value']">
178                                                <titleInfo>
179                                                        <title><xsl:value-of select="." /></title>
180                                                </titleInfo>
181                                        </xsl:for-each>
182                                       
183                                        <!-- author info; role and ID; ID is n[handle]_[role]_position() -->
184                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='contributor']/doc:element[@name='author']/doc:element/doc:field[@name='value']">
185                                                <xsl:call-template name="contributors">
186                                                        <xsl:with-param name="contributorName"><xsl:value-of select="."/></xsl:with-param>
187                                                        <xsl:with-param name="handle"><xsl:value-of select="//doc:field[@name='handle']"/></xsl:with-param>
188                                                        <xsl:with-param name="role"><xsl:text>aut</xsl:text></xsl:with-param>
189                                                </xsl:call-template>
190                                        </xsl:for-each>
191                                       
192                                        <!--thesis advisor; similar to author, with different role -->
193                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='contributor']/doc:element[@name='advisor']/doc:element/doc:field[@name='value']">
194                                                <xsl:call-template name="contributors">
195                                                        <xsl:with-param name="contributorName"><xsl:value-of select="."/></xsl:with-param>
196                                                        <xsl:with-param name="handle"><xsl:value-of select="//doc:field[@name='handle']"/></xsl:with-param>
197                                                        <xsl:with-param name="role"><xsl:text>ths</xsl:text></xsl:with-param>
198                                                </xsl:call-template>
199                                        </xsl:for-each>                                                         
200                                       
201                                        <!--if thesis-->
202                                        <xsl:variable name="typecontent" select="doc:metadata/doc:element[@name='dc']/doc:element[@name='type']/doc:element[@name='content']/doc:element/doc:field[@name='value']/text()"/>
203                                        <xsl:if test="substring($typecontent,1,4) = 'Diss'">
204                                                <name type="corporate">
205                                                        <namePart>University Utrecht</namePart>
206                                                        <role>
207                                                                <roleTerm authority="marcrelator" type="code">dgg</roleTerm>
208                                                        </role>
209                                                </name>
210                                        </xsl:if>
211                                       
212                                        <!--conference as author -->
213                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='creator']/doc:element[@name='congress']/doc:element/doc:field[@name='value']">
214                                                <name>
215                                                        <xsl:attribute name="type"><xsl:text>corporate</xsl:text></xsl:attribute>
216                                                        <namePart>
217                                                                <xsl:value-of select="." />
218                                                        </namePart>
219                                                        <role>
220                                                                <roleTerm>
221                                                                        <xsl:attribute name="authority"><xsl:text>marcrelator</xsl:text></xsl:attribute>
222                                                                        <xsl:attribute name="type"><xsl:text>code</xsl:text></xsl:attribute>
223                                                                        <xsl:text>aut</xsl:text>
224                                                                </roleTerm>
225                                                        </role>
226                                                </name>
227                                        </xsl:for-each>
228                                       
229                                        <!-- corporate authors -->
230                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='creator']/doc:element[@name='corporation']/doc:element/doc:field[@name='value']">
231                                                <name>
232                                                        <xsl:attribute name="type"><xsl:text>corporate</xsl:text></xsl:attribute>
233                                                        <namePart>
234                                                                <xsl:value-of select="." />
235                                                        </namePart>
236                                                        <role>
237                                                                <roleTerm>
238                                                                        <xsl:attribute name="authority"><xsl:text>marcrelator</xsl:text></xsl:attribute>
239                                                                        <xsl:attribute name="type"><xsl:text>code</xsl:text></xsl:attribute>
240                                                                        <xsl:text>aut</xsl:text>
241                                                                </roleTerm>
242                                                        </role>
243                                                </name>
244                                        </xsl:for-each>
245                                       
246                                        <!--corporations in other roles; for example digitizers -->
247                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='contributor']/doc:element[@name='digitizer']/doc:element/doc:field[@name='value']">
248                                                <name>
249                                                        <xsl:attribute name="type"><xsl:text>corporate</xsl:text></xsl:attribute>
250                                                        <namePart>
251                                                                <xsl:value-of select="." />
252                                                        </namePart>
253                                                        <role>
254                                                                <roleTerm>
255                                                                        <xsl:attribute name="authority"><xsl:text>marcrelator</xsl:text></xsl:attribute>
256                                                                        <xsl:attribute name="type"><xsl:text>code</xsl:text></xsl:attribute>
257                                                                        <xsl:text>oth</xsl:text>
258                                                                </roleTerm>
259                                                        </role>
260                                                </name>
261                                        </xsl:for-each>                                                         
262                                       
263                                        <!-- origin info; show place and publisher only if not ispartofmonograph and not ispartofseries; else that info goes into related item -->
264                                        <!-- edition if there is one -->
265                                        <originInfo>
266                                                <xsl:if test="not (doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofseries']/doc:element/doc:field[@name='value']) and not (doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofmonograph']/doc:element/doc:field[@name='value'])">
267
268                                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='publisher']/doc:element/doc:field[@name='value']">
269                                                                <publisher>
270                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='publisher']/doc:element/doc:field[@name='value']/text()" />
271                                                                </publisher>
272                                                        </xsl:if>
273                                                </xsl:if>
274                                               
275                                                <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='created']/doc:element/doc:field[@name='value']">
276                                                        <xsl:variable name="datecreated">
277                                                                <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='created']/doc:element/doc:field[@name='value']/text()" />
278                                                        </xsl:variable>
279                                                        <xsl:variable name="showdatecreated">
280                                                                <xsl:value-of select="substring($datecreated,1,10)" />
281                                                        </xsl:variable>
282                                                        <dateCreated encoding="iso8601">
283                                                                <xsl:value-of select="$showdatecreated"/>
284                                                        </dateCreated>
285                                                </xsl:if>
286                                               
287                                                <xsl:variable name="dateissued">
288                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='issued']/doc:element/doc:field[@name='value']/text()"/>
289                                                </xsl:variable>
290                                                <xsl:variable name="showdateissued">
291                                                        <xsl:value-of select="substring($dateissued,1,10)" />
292                                                </xsl:variable>
293                                                <!-- CLARIN demands dateCreated
294                                                <dateIssued encoding="iso8601">
295                                                        <xsl:value-of select="$showdateissued" />
296                                                </dateIssued>-->
297                                                <dateCreated encoding="iso8601">
298                                                        <xsl:value-of select="$showdateissued" />
299                                                </dateCreated>
300
301                                                <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='edition']/doc:element/doc:element/doc:field[@name='value']">
302                                                        <edition>
303                                                                <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='edition']/doc:element/doc:element/doc:field[@name='value']/text()" />
304                                                        </edition>
305                                                </xsl:if>
306                                               
307                                                <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='rights']/doc:element[@name='placeofpublication']/doc:element/doc:field[@name='value']">
308                                                        <place>
309                                                                <placeTerm>
310                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='rights']/doc:element[@name='placeofpublication']/doc:element/doc:field[@name='value']/text()" />
311                                                                </placeTerm>
312                                                        </place>
313                                                </xsl:if>
314                                        </originInfo>
315                                       
316                                        <!-- language -->
317                                        <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='language']/doc:element/doc:element/doc:field[@name='value']">
318                                                <language>
319                                                        <languageTerm authority="rfc3066" type="code"><xsl:value-of select="." /></languageTerm>
320                                                </language>
321                                        </xsl:for-each>
322                                       
323                                        <!-- subject = keywords; plus add coverage spatial and coverage temporal if present -->
324                                        <subject>
325                                                <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='subject']/doc:element[@name='keywords']/doc:element/doc:field[@name='value']">
326                                                        <topic><xsl:value-of select="." /></topic>
327                                                </xsl:for-each>
328                                                <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='coverage']/doc:element[@name='spatial']/doc:element/doc:field[@name='value']">
329                                                        <geographic>
330                                                                <xsl:value-of select="." />
331                                                        </geographic>
332                                                </xsl:for-each>
333                                                <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='coverage']/doc:element[@name='temporal']/doc:element/doc:field[@name='value']">
334                                                        <temporal>
335                                                                <xsl:value-of select="." />
336                                                        </temporal>
337                                                </xsl:for-each>
338                                        </subject>                                                             
339                                       
340                                        <!-- ispartofmonograph or ispartofseries-->
341                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofseries']/doc:element/doc:field[@name='value'] or doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofmonograph']/doc:element/doc:field[@name='value']">
342                                                <relatedItem>
343                                                        <xsl:attribute name="type">
344                                                                <xsl:text>host</xsl:text>
345                                                        </xsl:attribute>
346                                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofissn']/doc:element/doc:field[@name='value']">
347                                                                <identifier type="uri">
348                                                                        <xsl:text>URN:ISSN:</xsl:text>
349                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofissn']/doc:element/doc:field[@name='value']/text()" />
350                                                                </identifier>
351                                                        </xsl:if>
352                                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofisbn']/doc:element/doc:field[@name='value']">
353                                                                <identifier type="uri">
354                                                                        <xsl:text>URN:ISBN:</xsl:text>
355                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofisbn']/doc:element/doc:field[@name='value']/text()" />
356                                                                </identifier>
357                                                        </xsl:if>
358                                                        <titleInfo>
359                                                                <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofseries']/doc:element/doc:field[@name='value']">
360                                                                        <title>
361                                                                                <xsl:value-of select="." />
362                                                                        </title>
363                                                                </xsl:for-each>
364                                                                <xsl:for-each select="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofmonograph']/doc:element/doc:field[@name='value']">
365                                                                        <title>
366                                                                                <xsl:value-of select="." />
367                                                                        </title>
368                                                                </xsl:for-each>
369                                                        </titleInfo>
370                                                        <originInfo>
371                                                                <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='publisher']/doc:element/doc:field[@name='value']">
372                                                                        <publisher>
373                                                                                <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='publisher']/doc:element/doc:field[@name='value']/text()" />
374                                                                        </publisher>
375                                                                </xsl:if>
376                                                                <!--use another date if there is no date.issued -->
377                                                                <xsl:variable name="date">
378                                                                        <xsl:choose>
379                                                                                <xsl:when test="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='created']/doc:element/doc:field[@name='value']">
380                                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='created']/doc:element/doc:field[@name='value']/text()"/>
381                                                                                </xsl:when>
382                                                                                <xsl:otherwise>
383                                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='date']/doc:element[@name='issued']/doc:element/doc:field[@name='value']/text()"/>
384                                                                                </xsl:otherwise>
385                                                                        </xsl:choose>
386                                                                </xsl:variable>
387                                                                <xsl:variable name="showdate">
388                                                                        <xsl:value-of select="substring($date,1,10)" />
389                                                                </xsl:variable>
390                                                                <dateCreated encoding="iso8601">
391                                                                        <xsl:value-of select="$showdate" />
392                                                                </dateCreated>
393                                                                <!--
394                                                                <dateIssued encoding="iso8601">
395                                                                        <xsl:value-of select="$showdate" />
396                                                                </dateIssued>-->
397                                                               
398                                                                <!--place if one is given -->
399                                                                <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='rights']/doc:element[@name='placeofpublication']/doc:element/doc:field[@name='value']">
400                                                                        <place>
401                                                                                <placeTerm>
402                                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='rights']/doc:element[@name='placeofpublication']/doc:element/doc:field[@name='value']/text()" />
403                                                                                </placeTerm>
404                                                                        </place>
405                                                                </xsl:if>
406                                                        </originInfo>
407
408                                                        <part>
409                                                                <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofvolume']/doc:element/doc:field[@name='value']">
410                                                                        <detail type="volume">
411                                                                                <number>
412                                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofvolume']/doc:element/doc:field[@name='value']/text()" />
413                                                                                </number>
414                                                                        </detail>
415                                                                </xsl:if>
416                                                                <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofissue']/doc:element/doc:field[@name='value']">
417                                                                        <detail type="issue">
418                                                                                <number>
419                                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofissue']/doc:element/doc:field[@name='value']/text()" />
420                                                                                </number>
421                                                                        </detail>
422                                                                </xsl:if>
423                                                                <extent unit="page">
424                                                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofstartpage']/doc:element/doc:field[@name='value']">
425                                                                                <start>
426                                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofstartpage']/doc:element/doc:field[@name='value']/text()" />
427                                                                                </start>
428                                                                        </xsl:if>
429                                                                        <xsl:if test="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofendpage]']/doc:element/doc:field[@name='value']">
430                                                                                <end>
431                                                                                        <xsl:value-of select="doc:metadata/doc:element[@name='dc']/doc:element[@name='relation']/doc:element[@name='ispartofendpage]']/doc:element/doc:field[@name='value']/text()" />
432                                                                                </end>
433                                                                        </xsl:if>
434                                                                </extent>
435                                                        </part>
436                                                </relatedItem>
437                                        </xsl:if>
438
439
440
441
442                                </mods>
443
444                                               
445           </Components>
446        </CMD>
447    </xsl:template>
448                       
449        <xsl:template name="contributors">
450                <xsl:param name="contributorName"/>
451                <xsl:param name="handle" />
452                <xsl:param name="role" />
453               
454                <xsl:variable name="familyName">
455                        <xsl:value-of select="substring-before($contributorName, ',')" />;
456                </xsl:variable>
457                <xsl:variable name="givenName">
458                        <xsl:value-of select="substring-after($contributorName, ',')" />;
459                </xsl:variable>
460
461                <xsl:variable name="handlenumber">
462                        <xsl:value-of select="substring-after($handle, '/')" />
463                </xsl:variable>
464               
465                <xsl:variable name="authorID">
466                        <xsl:text>n</xsl:text>
467                        <xsl:value-of select="$handlenumber" />
468                        <xsl:text>_</xsl:text>
469                        <xsl:value-of select="$role" />
470                        <xsl:text>_</xsl:text>
471                        <xsl:value-of select="position()" />
472                </xsl:variable>
473                <name>
474                        <xsl:attribute name="type"><xsl:text>personal</xsl:text></xsl:attribute>
475                        <xsl:attribute name="ID"><xsl:value-of select="$authorID" /></xsl:attribute>
476                        <!-- for some reason, there's often a ; after the names; let's get rid of that -->
477                        <namePart type="family"><xsl:value-of select="substring-before($familyName, ';')" /></namePart>
478                        <namePart type="given"><xsl:value-of select="substring-before($givenName, ';')" /></namePart>
479                        <role>
480                                <roleTerm>
481                                        <xsl:attribute name="authority"><xsl:text>marcrelator</xsl:text></xsl:attribute>
482                                        <xsl:attribute name="type"><xsl:text>code</xsl:text></xsl:attribute>
483                                        <xsl:value-of select="$role" />
484                                </roleTerm>
485                        </role>
486                </name>
487        </xsl:template>                 
488
489        <!--boring mapping of internal type.content formats to standard formats -->
490        <!-- TODO: find all forms that actually occur in the database -->
491        <xsl:template name="genremapping">
492                <xsl:param name="typecontent" />
493               
494                <xsl:choose>
495                        <xsl:when test="substring($typecontent,1,4) = 'Anno'">
496                                <xsl:text>annotation</xsl:text>
497                        </xsl:when>
498                        <xsl:when test="substring($typecontent,1,4) = 'Arti'">
499                                <xsl:text>article</xsl:text>
500                        </xsl:when>
501                        <xsl:when test="substring($typecontent,1,4) = 'Bach'">
502                                <xsl:text>bachelorThesis</xsl:text>
503                        </xsl:when>
504                        <xsl:when test="$typecontent = 'Book review'">
505                                <xsl:text>bookReview</xsl:text>
506                        </xsl:when>
507                        <xsl:when test="substring($typecontent,1,4) = 'Book'">
508                                <xsl:text>book</xsl:text>
509                        </xsl:when>
510                        <xsl:when test="substring($typecontent,1,4) = 'Digi'"><!--digitized book; check database to see if this still occurs -->
511                                <xsl:text>book</xsl:text>
512                        </xsl:when>
513                        <xsl:when test="substring($typecontent,1,4) = 'Part'">
514                                <xsl:text>bookPart</xsl:text>
515                        </xsl:when>
516                        <xsl:when test="substring($typecontent,1,4) = 'Doct'">
517                                <xsl:text>doctoralThesis</xsl:text>
518                        </xsl:when>
519                        <xsl:when test="substring($typecontent,1,4) = 'Diss'">
520                                <xsl:text>doctoralThesis</xsl:text>
521                        </xsl:when>
522                        <xsl:when test="substring($typecontent,1,4) = 'Cont'">
523                                <xsl:text>contributionToPeriodical</xsl:text>
524                        </xsl:when>
525                        <xsl:when test="substring($typecontent,1,4) = 'News'">
526                                <xsl:text>contributionToPeriodical</xsl:text>
527                        </xsl:when>
528                        <xsl:when test="$typecontent = 'Conference report'">
529                                <xsl:text>report</xsl:text>
530                        </xsl:when>
531                        <xsl:when test="substring($typecontent,1,4) = 'Conf'">
532                                <xsl:text>lecture</xsl:text>
533                        </xsl:when>
534                        <xsl:when test="substring($typecontent,1,4) = 'Educ'">
535                                <xsl:text>lecture</xsl:text>
536                        </xsl:when>
537                        <xsl:when test="substring($typecontent,1,4) = 'Lect'">
538                                <xsl:text>lecture</xsl:text>
539                        </xsl:when>
540                        <xsl:when test="substring($typecontent,1,4) = 'Inau'">
541                                <xsl:text>lecture</xsl:text>
542                        </xsl:when>
543                        <xsl:when test="substring($typecontent,1,4) = 'Work'">
544                                <xsl:text>lecture</xsl:text>
545                        </xsl:when>
546                        <xsl:when test="substring($typecontent,1,4) = 'Mast'">
547                                <xsl:text>masterThesis</xsl:text>
548                        </xsl:when>
549                        <xsl:when test="substring($typecontent,1,4) = 'Pate'">
550                                <xsl:text>patent</xsl:text>
551                        </xsl:when>
552                        <!-- pamphlet as used by UvH -->
553                        <!--
554                        <xsl:when test="substring($typecontent,0,4) = 'Pamp'">
555                                <xsl:text>conferencePaper</xsl:text>
556                        </xsl:when>
557                        -->
558                        <xsl:when test="substring($typecontent,1,4) = 'Prep'">
559                                <xsl:text>preprint</xsl:text>
560                        </xsl:when>
561                        <xsl:when test="substring($typecontent,1,4) = 'Comm'">
562                                <xsl:text>report</xsl:text>
563                        </xsl:when>
564                        <xsl:when test="substring($typecontent,1,4) = 'Conf'">
565                                <xsl:text>report</xsl:text>
566                        </xsl:when>
567                        <xsl:when test="substring($typecontent,1,4) = 'Exte'">
568                                <xsl:text>report</xsl:text>
569                        </xsl:when>
570                        <xsl:when test="substring($typecontent,1,4) = 'Inte'">
571                                <xsl:text>report</xsl:text>
572                        </xsl:when>
573                        <xsl:when test="substring($typecontent,1,4) = 'Stat'">
574                                <xsl:text>report</xsl:text>
575                        </xsl:when>
576                        <xsl:when test="substring($typecontent,1,4) = 'Stud'">
577                                <xsl:text>studentThesis</xsl:text>
578                        </xsl:when>
579                        <xsl:when test="substring($typecontent,1,4) = 'Tech'">
580                                <xsl:text>technicalDocumentation</xsl:text>
581                        </xsl:when>
582                        <xsl:when test="substring($typecontent,1,4) = 'Rese'">
583                                <xsl:text>workingPaper</xsl:text>
584                        </xsl:when>
585                        <xsl:otherwise>
586                                <xsl:text>other</xsl:text>
587                        </xsl:otherwise>
588                </xsl:choose>
589        </xsl:template>
590
591       
592</xsl:stylesheet>