Added IE/FF compatibility functions.
[pazpar2-moved-to-github.git] / etc / marc21.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- $Id: marc21.xsl,v 1.15 2007-07-16 15:21:29 adam Exp $ -->
3 <xsl:stylesheet
4     version="1.0"
5     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
6     xmlns:pz="http://www.indexdata.com/pazpar2/1.0"
7     xmlns:marc="http://www.loc.gov/MARC21/slim">
8   
9   <xsl:output indent="yes" method="xml" version="1.0" encoding="UTF-8"/>
10
11 <!-- Extract metadata from MARC21/USMARC 
12       http://www.loc.gov/marc/bibliographic/ecbdhome.html
13 -->  
14   
15   <xsl:template match="/marc:record">
16     <xsl:variable name="title_medium" select="marc:datafield[@tag='245']/marc:subfield[@code='h']"/>
17     <xsl:variable name="journal_title" select="marc:datafield[@tag='773']/marc:subfield[@code='t']"/>
18     <xsl:variable name="electronic_location_url" select="marc:datafield[@tag='856']/marc:subfield[@code='u']"/>
19     <xsl:variable name="fulltext_a" select="marc:datafield[@tag='900']/marc:subfield[@code='a']"/>
20     <xsl:variable name="fulltext_b" select="marc:datafield[@tag='900']/marc:subfield[@code='b']"/>
21     <xsl:variable name="medium">
22       <xsl:choose>
23         <xsl:when test="$title_medium">
24           <xsl:value-of select="substring-after(substring-before($title_medium,']'),'[')"/>
25         </xsl:when>
26         <xsl:when test="$fulltext_a">
27           <xsl:text>electronic resource</xsl:text>
28         </xsl:when>
29         <xsl:when test="$fulltext_b">
30           <xsl:text>electronic resource</xsl:text>
31         </xsl:when>
32         <xsl:when test="$electronic_location_url">
33           <xsl:text>electronic resource</xsl:text>
34         </xsl:when>
35         <xsl:when test="$journal_title">
36           <xsl:text>article</xsl:text>
37         </xsl:when>
38         <xsl:otherwise>
39           <xsl:text>book</xsl:text>
40         </xsl:otherwise>
41       </xsl:choose>
42     </xsl:variable>
43
44     <pz:record>
45       <xsl:attribute name="mergekey">
46         <xsl:text>title </xsl:text>
47         <xsl:value-of select="marc:datafield[@tag='245']/marc:subfield[@code='a']"/>
48         <xsl:text> author </xsl:text>
49         <xsl:value-of select="marc:datafield[@tag='100']/marc:subfield[@code='a']"/>
50         <xsl:text> medium </xsl:text>
51         <xsl:value-of select="$medium"/>
52       </xsl:attribute>
53
54       <xsl:for-each select="marc:controlfield[@tag='001']">
55         <pz:metadata type="id">
56           <xsl:value-of select="."/>
57         </pz:metadata>
58       </xsl:for-each>
59
60       <xsl:for-each select="marc:datafield[@tag='010']">
61         <pz:metadata type="lccn">
62           <xsl:value-of select="marc:subfield[@code='a']"/>
63         </pz:metadata>
64       </xsl:for-each>
65
66       <xsl:for-each select="marc:datafield[@tag='020']">
67         <pz:metadata type="isbn">
68           <xsl:value-of select="marc:subfield[@code='a']"/>
69         </pz:metadata>
70       </xsl:for-each>
71
72       <xsl:for-each select="marc:datafield[@tag='022']">
73         <pz:metadata type="issn">
74           <xsl:value-of select="marc:subfield[@code='a']"/>
75         </pz:metadata>
76       </xsl:for-each>
77
78       <xsl:for-each select="marc:datafield[@tag='027']">
79         <pz:metadata type="tech-rep-nr">
80           <xsl:value-of select="marc:subfield[@code='a']"/>
81         </pz:metadata>
82       </xsl:for-each>
83
84       <xsl:for-each select="marc:datafield[@tag='100']">
85         <pz:metadata type="author">
86           <xsl:value-of select="marc:subfield[@code='a']"/>
87         </pz:metadata>
88         <pz:metadata type="author-title">
89           <xsl:value-of select="marc:subfield[@code='c']"/>
90         </pz:metadata>
91         <pz:metadata type="author-date">
92           <xsl:value-of select="marc:subfield[@code='d']"/>
93         </pz:metadata>
94       </xsl:for-each>
95
96       <xsl:for-each select="marc:datafield[@tag='110']">
97         <pz:metadata type="corporate-name">
98             <xsl:value-of select="marc:subfield[@code='a']"/>
99         </pz:metadata>
100         <pz:metadata type="corporate-location">
101             <xsl:value-of select="marc:subfield[@code='c']"/>
102         </pz:metadata>
103         <pz:metadata type="corporate-date">
104             <xsl:value-of select="marc:subfield[@code='d']"/>
105         </pz:metadata>
106       </xsl:for-each>
107
108       <xsl:for-each select="marc:datafield[@tag='111']">
109         <pz:metadata type="meeting-name">
110             <xsl:value-of select="marc:subfield[@code='a']"/>
111         </pz:metadata>
112         <pz:metadata type="meeting-location">
113             <xsl:value-of select="marc:subfield[@code='c']"/>
114         </pz:metadata>
115         <pz:metadata type="meeting-date">
116             <xsl:value-of select="marc:subfield[@code='d']"/>
117         </pz:metadata>
118       </xsl:for-each>
119
120       <xsl:for-each select="marc:datafield[@tag='260']">
121         <pz:metadata type="date">
122             <xsl:value-of select="marc:subfield[@code='c']"/>
123         </pz:metadata>
124       </xsl:for-each>
125
126       <xsl:for-each select="marc:datafield[@tag='245']">
127         <pz:metadata type="title">
128           <xsl:value-of select="marc:subfield[@code='a']"/>
129         </pz:metadata>
130         <pz:metadata type="title-remainder">
131           <xsl:value-of select="marc:subfield[@code='b']"/>
132         </pz:metadata>
133         <pz:metadata type="title-responsibility">
134           <xsl:value-of select="marc:subfield[@code='c']"/>
135         </pz:metadata>
136         <pz:metadata type="title-dates">
137           <xsl:value-of select="marc:subfield[@code='f']"/>
138         </pz:metadata>
139         <pz:metadata type="title-medium">
140           <xsl:value-of select="marc:subfield[@code='h']"/>
141         </pz:metadata>
142       </xsl:for-each>
143
144       <xsl:for-each select="marc:datafield[@tag='250']">
145         <pz:metadata type="edition">
146             <xsl:value-of select="marc:subfield[@code='a']"/>
147         </pz:metadata>
148       </xsl:for-each>
149
150       <xsl:for-each select="marc:datafield[@tag='260']">
151         <pz:metadata type="publication-place">
152           <xsl:value-of select="marc:subfield[@code='a']"/>
153         </pz:metadata>
154         <pz:metadata type="publication-name">
155           <xsl:value-of select="marc:subfield[@code='b']"/>
156         </pz:metadata>
157         <pz:metadata type="publication-date">
158           <xsl:value-of select="marc:subfield[@code='c']"/>
159         </pz:metadata>
160       </xsl:for-each>
161
162       <xsl:for-each select="marc:datafield[@tag='300']">
163         <pz:metadata type="physical-extent">
164           <xsl:value-of select="marc:subfield[@code='a']"/>
165         </pz:metadata>
166         <pz:metadata type="physical-format">
167           <xsl:value-of select="marc:subfield[@code='b']"/>
168         </pz:metadata>
169         <pz:metadata type="physical-dimensions">
170           <xsl:value-of select="marc:subfield[@code='c']"/>
171         </pz:metadata>
172         <pz:metadata type="physical-accomp">
173           <xsl:value-of select="marc:subfield[@code='e']"/>
174         </pz:metadata>
175         <pz:metadata type="physical-unittype">
176           <xsl:value-of select="marc:subfield[@code='f']"/>
177         </pz:metadata>
178         <pz:metadata type="physical-unitsize">
179           <xsl:value-of select="marc:subfield[@code='g']"/>
180         </pz:metadata>
181         <pz:metadata type="physical-specified">
182           <xsl:value-of select="marc:subfield[@code='3']"/>
183         </pz:metadata>
184       </xsl:for-each>
185
186       <xsl:for-each select="marc:datafield[@tag='440']">
187         <pz:metadata type="series-title">
188           <xsl:value-of select="marc:subfield[@code='a']"/>
189         </pz:metadata>
190       </xsl:for-each>
191
192       <xsl:for-each select="marc:datafield[@tag &gt;= 500 and @tag &lt;= 599]
193                             [@tag != '506' and @tag != '530' and
194                             @tag != '540' and @tag != '546'
195                             and @tag != '522']">
196         <pz:metadata type="description">
197             <xsl:value-of select="*/text()"/>
198         </pz:metadata>
199       </xsl:for-each>
200       
201       <xsl:for-each select="marc:datafield[@tag='650' or @tag='653']">
202         <pz:metadata type="subject">
203           <xsl:value-of select="marc:subfield[@code='a']"/>
204         </pz:metadata>
205       </xsl:for-each>
206
207       <xsl:for-each select="marc:datafield[@tag='856']">
208         <pz:metadata type="electronic-url">
209           <xsl:value-of select="marc:subfield[@code='u']"/>
210         </pz:metadata>
211         <pz:metadata type="electronic-text">
212           <xsl:value-of select="marc:subfield[@code='y']"/>
213         </pz:metadata>
214         <pz:metadata type="electronic-note">
215           <xsl:value-of select="marc:subfield[@code='z']"/>
216         </pz:metadata>
217       </xsl:for-each>
218
219       <xsl:for-each select="marc:datafield[@tag='773']">
220         <pz:metadata type="citation">
221           <xsl:for-each select="*">
222             <xsl:value-of select="normalize-space(.)"/>
223             <xsl:text> </xsl:text>
224           </xsl:for-each>
225         </pz:metadata>
226       </xsl:for-each>
227
228       <pz:metadata type="medium">
229         <xsl:value-of select="$medium"/>
230       </pz:metadata>
231       
232       <xsl:if test="$fulltext_a">
233         <pz:metadata type="fulltext">
234           <xsl:value-of select="$fulltext_a"/>
235         </pz:metadata>
236       </xsl:if>
237
238       <xsl:if test="$fulltext_b">
239         <pz:metadata type="fulltext">
240           <xsl:value-of select="$fulltext_b"/>
241         </pz:metadata>
242       </xsl:if>
243     </pz:record>
244   </xsl:template>
245
246 </xsl:stylesheet>