xcard.rng 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. # RELAX NG Schema for vCard in XML
  2. # Extract from RFC6351.
  3. # Erratum 2994 applied.
  4. # Erratum 3047 applied.
  5. # Erratum 3008 applied.
  6. # Erratum 4247 applied.
  7. default namespace = "urn:ietf:params:xml:ns:vcard-4.0"
  8. ### Section 3.3: vCard Format Specification
  9. #
  10. # 3.3
  11. iana-token = xsd:string { pattern = "[a-zA-Z0-9\-]+" }
  12. x-name = xsd:string { pattern = "x-[a-zA-Z0-9\-]+" }
  13. ### Section 4: Value types
  14. #
  15. # 4.1
  16. value-text = element text { text }
  17. value-text-list = value-text+
  18. # 4.2
  19. value-uri = element uri { xsd:anyURI }
  20. # 4.3.1
  21. value-date = element date {
  22. xsd:string { pattern = "\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d" }
  23. }
  24. # 4.3.2
  25. value-time = element time {
  26. xsd:string { pattern = "(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d)?|--\d\d)"
  27. ~ "(Z|[+\-]\d\d(\d\d)?)?" }
  28. }
  29. # 4.3.3
  30. value-date-time = element date-time {
  31. xsd:string { pattern = "(\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?"
  32. ~ "(Z|[+\-]\d\d(\d\d)?)?" }
  33. }
  34. # 4.3.4
  35. value-date-and-or-time = value-date | value-date-time | value-time
  36. # 4.3.5
  37. value-timestamp = element timestamp {
  38. xsd:string { pattern = "\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?" }
  39. }
  40. # 4.4
  41. value-boolean = element boolean { xsd:boolean }
  42. # 4.5
  43. value-integer = element integer { xsd:integer }
  44. # 4.6
  45. value-float = element float { xsd:float }
  46. # 4.7
  47. value-utc-offset = element utc-offset {
  48. xsd:string { pattern = "[+\-]\d\d(\d\d)?" }
  49. }
  50. # 4.8
  51. value-language-tag = element language-tag {
  52. xsd:string { pattern = "([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8})"
  53. ~ "(-[a-z]{4})?(-([a-z]{2}|\d{3}))?"
  54. ~ "(-([0-9a-z]{5,8}|\d[0-9a-z]{3}))*"
  55. ~ "(-[0-9a-wyz](-[0-9a-z]{2,8})+)*"
  56. ~ "(-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|"
  57. ~ "[a-z]{1,3}(-[0-9a-z]{2,8}){1,2}" }
  58. }
  59. ### Section 5: Parameters
  60. #
  61. # 5.1
  62. param-language = element language { value-language-tag }?
  63. # 5.2
  64. param-pref = element pref {
  65. element integer {
  66. xsd:integer { minInclusive = "1" maxInclusive = "100" }
  67. }
  68. }?
  69. # 5.4
  70. param-altid = element altid { value-text }?
  71. # 5.5
  72. param-pid = element pid {
  73. element text { xsd:string { pattern = "\d+(\.\d+)?" } }+
  74. }?
  75. # 5.6
  76. param-type = element type { element text { "work" | "home" }+ }?
  77. # 5.7
  78. param-mediatype = element mediatype { value-text }?
  79. # 5.8
  80. param-calscale = element calscale { element text { "gregorian" } }?
  81. # 5.9
  82. param-sort-as = element sort-as { value-text+ }?
  83. # 5.10
  84. param-geo = element geo { value-uri }?
  85. # 5.11
  86. param-tz = element tz { value-text | value-uri }?
  87. ### Section 6: Properties
  88. #
  89. # 6.1.3
  90. property-source = element source {
  91. element parameters { param-altid, param-pid, param-pref,
  92. param-mediatype }?,
  93. value-uri
  94. }
  95. # 6.1.4
  96. property-kind = element kind {
  97. element text { "individual" | "group" | "org" | "location" |
  98. x-name | iana-token }*
  99. }
  100. # 6.2.1
  101. property-fn = element fn {
  102. element parameters { param-language, param-altid, param-pid,
  103. param-pref, param-type }?,
  104. value-text
  105. }
  106. # 6.2.2
  107. property-n = element n {
  108. element parameters { param-language, param-sort-as, param-altid }?,
  109. element surname { text }+,
  110. element given { text }+,
  111. element additional { text }+,
  112. element prefix { text }+,
  113. element suffix { text }+
  114. }
  115. # 6.2.3
  116. property-nickname = element nickname {
  117. element parameters { param-language, param-altid, param-pid,
  118. param-pref, param-type }?,
  119. value-text-list
  120. }
  121. # 6.2.4
  122. property-photo = element photo {
  123. element parameters { param-altid, param-pid, param-pref, param-type,
  124. param-mediatype }?,
  125. value-uri
  126. }
  127. # 6.2.5
  128. property-bday = element bday {
  129. element parameters { param-altid, param-calscale }?,
  130. (value-date-and-or-time | value-text)
  131. }
  132. # 6.2.6
  133. property-anniversary = element anniversary {
  134. element parameters { param-altid, param-calscale }?,
  135. (value-date-and-or-time | value-text)
  136. }
  137. # 6.2.7
  138. property-gender = element gender {
  139. element sex { "" | "M" | "F" | "O" | "N" | "U" },
  140. element identity { text }?
  141. }
  142. # 6.3.1
  143. param-label = element label { value-text }?
  144. property-adr = element adr {
  145. element parameters { param-language, param-altid, param-pid,
  146. param-pref, param-type, param-geo, param-tz,
  147. param-label }?,
  148. element pobox { text }+,
  149. element ext { text }+,
  150. element street { text }+,
  151. element locality { text }+,
  152. element region { text }+,
  153. element code { text }+,
  154. element country { text }+
  155. }
  156. # 6.4.1
  157. property-tel = element tel {
  158. element parameters {
  159. param-altid,
  160. param-pid,
  161. param-pref,
  162. element type {
  163. element text { "work" | "home" | "text" | "voice"
  164. | "fax" | "cell" | "video" | "pager"
  165. | "textphone" | x-name | iana-token }+
  166. }?,
  167. param-mediatype
  168. }?,
  169. (value-text | value-uri)
  170. }
  171. # 6.4.2
  172. property-email = element email {
  173. element parameters { param-altid, param-pid, param-pref,
  174. param-type }?,
  175. value-text
  176. }
  177. # 6.4.3
  178. property-impp = element impp {
  179. element parameters { param-altid, param-pid, param-pref,
  180. param-type, param-mediatype }?,
  181. value-uri
  182. }
  183. # 6.4.4
  184. property-lang = element lang {
  185. element parameters { param-altid, param-pid, param-pref,
  186. param-type }?,
  187. value-language-tag
  188. }
  189. # 6.5.1
  190. property-tz = element tz {
  191. element parameters { param-altid, param-pid, param-pref,
  192. param-type, param-mediatype }?,
  193. (value-text | value-uri | value-utc-offset)
  194. }
  195. # 6.5.2
  196. property-geo = element geo {
  197. element parameters { param-altid, param-pid, param-pref,
  198. param-type, param-mediatype }?,
  199. value-uri
  200. }
  201. # 6.6.1
  202. property-title = element title {
  203. element parameters { param-language, param-altid, param-pid,
  204. param-pref, param-type }?,
  205. value-text
  206. }
  207. # 6.6.2
  208. property-role = element role {
  209. element parameters { param-language, param-altid, param-pid,
  210. param-pref, param-type }?,
  211. value-text
  212. }
  213. # 6.6.3
  214. property-logo = element logo {
  215. element parameters { param-language, param-altid, param-pid,
  216. param-pref, param-type, param-mediatype }?,
  217. value-uri
  218. }
  219. # 6.6.4
  220. property-org = element org {
  221. element parameters { param-language, param-altid, param-pid,
  222. param-pref, param-type, param-sort-as }?,
  223. value-text-list
  224. }
  225. # 6.6.5
  226. property-member = element member {
  227. element parameters { param-altid, param-pid, param-pref,
  228. param-mediatype }?,
  229. value-uri
  230. }
  231. # 6.6.6
  232. property-related = element related {
  233. element parameters {
  234. param-altid,
  235. param-pid,
  236. param-pref,
  237. element type {
  238. element text {
  239. "work" | "home" | "contact" | "acquaintance" |
  240. "friend" | "met" | "co-worker" | "colleague" | "co-resident" |
  241. "neighbor" | "child" | "parent" | "sibling" | "spouse" |
  242. "kin" | "muse" | "crush" | "date" | "sweetheart" | "me" |
  243. "agent" | "emergency"
  244. }+
  245. }?,
  246. param-mediatype
  247. }?,
  248. (value-uri | value-text)
  249. }
  250. # 6.7.1
  251. property-categories = element categories {
  252. element parameters { param-altid, param-pid, param-pref,
  253. param-type }?,
  254. value-text-list
  255. }
  256. # 6.7.2
  257. property-note = element note {
  258. element parameters { param-language, param-altid, param-pid,
  259. param-pref, param-type }?,
  260. value-text
  261. }
  262. # 6.7.3
  263. property-prodid = element prodid { value-text }
  264. # 6.7.4
  265. property-rev = element rev { value-timestamp }
  266. # 6.7.5
  267. property-sound = element sound {
  268. element parameters { param-language, param-altid, param-pid,
  269. param-pref, param-type, param-mediatype }?,
  270. value-uri
  271. }
  272. # 6.7.6
  273. property-uid = element uid { value-uri }
  274. # 6.7.7
  275. property-clientpidmap = element clientpidmap {
  276. element sourceid { xsd:positiveInteger },
  277. value-uri
  278. }
  279. # 6.7.8
  280. property-url = element url {
  281. element parameters { param-altid, param-pid, param-pref,
  282. param-type, param-mediatype }?,
  283. value-uri
  284. }
  285. # 6.8.1
  286. property-key = element key {
  287. element parameters { param-altid, param-pid, param-pref,
  288. param-type, param-mediatype }?,
  289. (value-uri | value-text)
  290. }
  291. # 6.9.1
  292. property-fburl = element fburl {
  293. element parameters { param-altid, param-pid, param-pref,
  294. param-type, param-mediatype }?,
  295. value-uri
  296. }
  297. # 6.9.2
  298. property-caladruri = element caladruri {
  299. element parameters { param-altid, param-pid, param-pref,
  300. param-type, param-mediatype }?,
  301. value-uri
  302. }
  303. # 6.9.3
  304. property-caluri = element caluri {
  305. element parameters { param-altid, param-pid, param-pref,
  306. param-type, param-mediatype }?,
  307. value-uri
  308. }
  309. # Top-level grammar
  310. property = property-adr | property-anniversary | property-bday
  311. | property-caladruri | property-caluri | property-categories
  312. | property-clientpidmap | property-email | property-fburl
  313. | property-fn | property-geo | property-impp | property-key
  314. | property-kind | property-lang | property-logo
  315. | property-member | property-n | property-nickname
  316. | property-note | property-org | property-photo
  317. | property-prodid | property-related | property-rev
  318. | property-role | property-gender | property-sound
  319. | property-source | property-tel | property-title
  320. | property-tz | property-uid | property-url
  321. start = element vcards {
  322. element vcard {
  323. (property
  324. | element group {
  325. attribute name { text },
  326. property*
  327. })+
  328. }+
  329. }