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