1# The RIS XML DTD - a XML application based on the RIS reference format
2
3# (C) 2003-03-22 Markus Hoenicka <markus@mhoenicka.de>
4
5# Invoke with the following declaration
6
7# <!DOCTYPE ris PUBLIC "-//Markus Hoenicka//DTD Ris V1.2.0//EN" "http://refdb.sourceforge.net/dtd/risx-1.2.0/risx.dtd">
8
9# the top-level element
10
11namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
12
13ris = element ris { attlist.ris, entry+ }
14attlist.ris &= empty
15# each RIS dataset is encoded by the following structure:
16
17# part, publication, and set denote the analytical, monographic, and
18
19# serial level of bibliographic information.
20
21# libinfo contains all information relevant for local housekeeping
22
23# contents describes the contents of the reference described by the
24
25# dataset
26
27# the type attribute is equivalent to the TY RIS field
28
29# the identifier attributes: ID is a numeric one, while citekey is an
30
31# alphanumeric key. Both are supposed to be unique in a database
32entry =
33  element entry {
34    attlist.entry, (part?, publication, set?, libinfo*, contents?)+
35  }
36attlist.entry &=
37  [ a:defaultValue = "GEN" ]
38  attribute type {
39    "ABST"
40    | "ADVS"
41    | "ART"
42    | "BILL"
43    | "BOOK"
44    | "CASE"
45    | "CHAP"
46    | "COMP"
47    | "CONF"
48    | "CTLG"
49    | "DATA"
50    | "ELEC"
51    | "GEN"
52    | "HEAR"
53    | "ICOMM"
54    | "INPR"
55    | "JFULL"
56    | "JOUR"
57    | "MAP"
58    | "MGZN"
59    | "MPCT"
60    | "MUSIC"
61    | "NEWS"
62    | "PAMP"
63    | "PAT"
64    | "PCOMM"
65    | "RPRT"
66    | "SER"
67    | "SLIDE"
68    | "SOUND"
69    | "STAT"
70    | "THES"
71    | "UNBILL"
72    | "UNPB"
73    | "VIDEO"
74  }?,
75  attribute id { xsd:NMTOKEN }?,
76  attribute citekey { xsd:NMTOKEN }?
77# the three levels of bibliographic information
78part = element part { attlist.part, title, author* }
79attlist.part &= empty
80publication =
81  element publication { attlist.publication, title*, author*, pubinfo? }
82attlist.publication &= empty
83set = element set { attlist.set, title*, author* }
84attlist.set &= empty
85# the apparatus used in the bibliographic information
86title = element title { attlist.title, text }
87attlist.title &=
88  attribute type { "full" | "abbrev" | "user1" | "user2" },
89  attribute freq { xsd:NMTOKEN }?,
90  attribute relfreq { xsd:NMTOKEN }?
91# The url element is gone in favour of 'link type="url"'. Both elements use the same semantics so it would be weird to keep them separately
92pubinfo =
93  element pubinfo {
94    attlist.pubinfo,
95    pubdate*,
96    volume?,
97    issue?,
98    startpage?,
99    endpage?,
100    city?,
101    publisher?,
102    serial?,
103    address?,
104    userdef*,
105    misc*,
106    link*
107  }
108attlist.pubinfo &= empty
109pubdate = element pubdate { attlist.pubdate, date, otherinfo? }
110attlist.pubdate &=
111  [ a:defaultValue = "primary" ]
112  attribute type { "primary" | "secondary" }?
113date = element date { attlist.date, year?, month?, day? }
114attlist.date &= empty
115year = element year { attlist.year, text }
116attlist.year &= empty
117month = element month { attlist.month, text }
118attlist.month &= empty
119day = element day { attlist.day, text }
120attlist.day &= empty
121otherinfo = element otherinfo { attlist.otherinfo, text }
122attlist.otherinfo &= empty
123volume = element volume { attlist.volume, text }
124attlist.volume &= empty
125issue = element issue { attlist.issue, text }
126attlist.issue &= empty
127startpage = element startpage { attlist.startpage, text }
128attlist.startpage &= empty
129endpage = element endpage { attlist.endpage, text }
130attlist.endpage &= empty
131city = element city { attlist.city, text }
132attlist.city &= empty
133publisher = element publisher { attlist.publisher, text }
134attlist.publisher &= empty
135serial = element serial { attlist.serial, text }
136attlist.serial &= empty
137address = element address { attlist.address, text }
138attlist.address &= empty
139userdef = element userdef { attlist.userdef, text }
140attlist.userdef &=
141  [ a:defaultValue = "1" ]
142  attribute type { "1" | "2" | "3" | "4" | "5" }?
143misc = element misc { attlist.misc, text }
144attlist.misc &=
145  [ a:defaultValue = "1" ] attribute type { "1" | "2" | "3" }?
146link = element link { attlist.link, text }
147attlist.link &=
148  [ a:defaultValue = "url" ]
149  attribute type {
150    "url" | "pdf" | "fulltext" | "related" | "image" | "doi"
151  }?
152# the libinfo element contains the local housekeeping information
153
154# specific to a single user
155libinfo =
156  element libinfo {
157    attlist.libinfo, notes?, reprint, availability?, link*
158  }
159attlist.libinfo &= attribute user { xsd:NMTOKEN }
160notes = element notes { attlist.notes, text }
161attlist.notes &= empty
162reprint = element reprint { attlist.reprint, date? }
163attlist.reprint &=
164  [ a:defaultValue = "NOTINFILE" ]
165  attribute status { "NOTINFILE" | "ONREQUEST" | "INFILE" }?
166availability = element availability { attlist.availability, text }
167attlist.availability &=
168  [ a:defaultValue = "full" ] attribute type { "full" | "useroot" }?
169# the contents element contains information about the contents of
170
171# the reference
172contents = element contents { attlist.contents, abstract?, keyword* }
173attlist.contents &= empty
174abstract = element abstract { attlist.abstract, text }
175attlist.abstract &= empty
176keyword = element keyword { attlist.keyword, text }
177attlist.keyword &=
178  attribute freq { xsd:NMTOKEN }?,
179  attribute relfreq { xsd:NMTOKEN }?
180# the author element
181author =
182  element author {
183    attlist.author,
184    (name | (lastname?, firstname?, middlename*, suffix?))
185  }
186attlist.author &=
187  attribute role { xsd:NMTOKEN }?,
188  attribute freq { xsd:NMTOKEN }?,
189  attribute relfreq { xsd:NMTOKEN }?
190name = element name { attlist.name, text }
191attlist.name &= empty
192lastname = element lastname { attlist.lastname, text }
193attlist.lastname &= empty
194firstname = element firstname { attlist.firstname, text }
195attlist.firstname &= empty
196middlename = element middlename { attlist.middlename, text }
197attlist.middlename &= empty
198suffix = element suffix { attlist.suffix, text }
199attlist.suffix &= empty
200start = ris
201