1 <?xml version="1.0" encoding="UTF-8"?>
2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:ietf:params:xml:ns:vcard-4.0" xmlns:ns1="urn:ietf:params:xml:ns:vcard-4.0">
7 <!-- mbaudier - 2022-05-31 : corrected regexp from RFC 6351 -->
8 <xs:simpleType name="iana-token">
10 <xs:documentation>Section 3.3: vCard Format Specification</xs:documentation>
12 <xs:restriction base="xs:string">
13 <xs:pattern value="[a-zA-Z0-9]+"/>
16 <!-- mbaudier - 2022-05-31 : corrected regexp from RFC 6351 -->
17 <xs:simpleType name="x-name">
18 <xs:restriction base="xs:string">
19 <xs:pattern value="x-[a-zA-Z0-9]+"/>
26 <xs:element name="text" type="xs:string"/>
27 <xs:group name="value-text-list">
29 <xs:element maxOccurs="unbounded" ref="ns1:text"/>
33 <xs:element name="uri" type="xs:anyURI"/>
35 <xs:element name="date" substitutionGroup="ns1:value-date-and-or-time">
37 <xs:restriction base="xs:string">
38 <xs:pattern value="\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d"/>
43 <xs:element name="time" substitutionGroup="ns1:value-date-and-or-time">
45 <xs:restriction base="xs:string">
46 <xs:pattern value="(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)(Z|[+\-]\d\d(\d\d)?)?"/>
51 <xs:element name="date-time" substitutionGroup="ns1:value-date-and-or-time">
53 <xs:restriction base="xs:string">
54 <xs:pattern value="(\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?(Z|[+\-]\d\d(\d\d)?)?"/>
59 <xs:element name="value-date-and-or-time" abstract="true"/>
61 <xs:complexType name="value-timestamp">
63 <xs:element ref="ns1:timestamp"/>
66 <xs:element name="timestamp">
68 <xs:restriction base="xs:string">
69 <xs:pattern value="\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?"/>
74 <xs:element name="boolean" type="xs:boolean"/>
76 <xs:element name="integer" type="xs:integer"/>
78 <xs:element name="float" type="xs:float"/>
80 <xs:element name="utc-offset">
82 <xs:restriction base="xs:string">
83 <xs:pattern value="[+\-]\d\d(\d\d)?"/>
88 <xs:element name="language-tag">
90 <xs:restriction base="xs:string">
91 <xs:pattern value="([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8})(-[a-z]{4})?(-([a-z]{2}|\d{3}))?(-([0-9a-z]{5,8}|\d[0-9a-z]{3}))*(-[0-9a-wyz](-[0-9a-z]{2,8})+)*(-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|[a-z]{1,3}(-[0-9a-z]{2,8}){1,2}"/>
99 <xs:group name="param-language">
101 <xs:documentation>Section 5: Parameters</xs:documentation>
104 <xs:element minOccurs="0" ref="ns1:language"/>
107 <xs:element name="language">
110 <xs:element ref="ns1:language-tag"/>
115 <xs:group name="param-pref">
117 <xs:element minOccurs="0" ref="ns1:pref"/>
120 <xs:element name="pref">
123 <xs:element name="integer">
125 <xs:restriction base="xs:integer">
126 <xs:minInclusive value="1"/>
127 <xs:maxInclusive value="100"/>
135 <xs:group name="param-altid">
137 <xs:element minOccurs="0" ref="ns1:altid"/>
140 <xs:element name="altid">
143 <xs:element ref="ns1:text"/>
148 <xs:group name="param-pid">
150 <xs:element minOccurs="0" ref="ns1:pid"/>
153 <xs:element name="pid">
156 <xs:element maxOccurs="unbounded" name="text">
158 <xs:restriction base="xs:string">
159 <xs:pattern value="\d+(\.\d+)?"/>
167 <xs:group name="param-type">
169 <xs:element minOccurs="0" ref="ns1:type"/>
172 <xs:element name="type">
175 <xs:element maxOccurs="unbounded" name="text">
177 <xs:restriction base="xs:token">
178 <xs:enumeration value="work"/>
179 <xs:enumeration value="home"/>
187 <xs:group name="param-mediatype">
189 <xs:element minOccurs="0" ref="ns1:mediatype"/>
192 <xs:element name="mediatype">
195 <xs:element ref="ns1:text"/>
200 <xs:group name="param-calscale">
202 <xs:element minOccurs="0" ref="ns1:calscale"/>
205 <xs:element name="calscale">
208 <xs:element name="text">
210 <xs:restriction base="xs:token">
211 <xs:enumeration value="gregorian"/>
219 <xs:group name="param-sort-as">
221 <xs:element minOccurs="0" ref="ns1:sort-as"/>
224 <xs:element name="sort-as">
227 <xs:element maxOccurs="unbounded" ref="ns1:text"/>
232 <xs:group name="param-geo">
234 <xs:element minOccurs="0" name="geo">
237 <xs:element ref="ns1:uri"/>
244 <xs:group name="param-tz">
246 <xs:element minOccurs="0" name="tz">
249 <xs:element ref="ns1:text"/>
250 <xs:element ref="ns1:uri"/>
260 <xs:element name="source">
263 <xs:element name="parameters">
266 <xs:group ref="ns1:param-altid"/>
267 <xs:group ref="ns1:param-pid"/>
268 <xs:group ref="ns1:param-pref"/>
269 <xs:group ref="ns1:param-mediatype"/>
273 <xs:element ref="ns1:uri"/>
278 <xs:element name="kind">
281 <xs:element minOccurs="0" maxOccurs="unbounded" name="text">
283 <xs:union memberTypes="ns1:x-name ns1:iana-token">
285 <xs:restriction base="xs:token">
286 <xs:enumeration value="individual"/>
290 <xs:restriction base="xs:token">
291 <xs:enumeration value="group"/>
295 <xs:restriction base="xs:token">
296 <xs:enumeration value="org"/>
300 <xs:restriction base="xs:token">
301 <xs:enumeration value="location"/>
311 <xs:element name="fn">
314 <xs:element minOccurs="0" name="parameters">
317 <xs:group ref="ns1:param-language"/>
318 <xs:group ref="ns1:param-altid"/>
319 <xs:group ref="ns1:param-pid"/>
320 <xs:group ref="ns1:param-pref"/>
321 <xs:group ref="ns1:param-type"/>
325 <xs:element ref="ns1:text"/>
330 <xs:element name="n">
333 <xs:element minOccurs="0" name="parameters">
336 <xs:group ref="ns1:param-language"/>
337 <xs:group ref="ns1:param-sort-as"/>
338 <xs:group ref="ns1:param-altid"/>
342 <xs:element maxOccurs="unbounded" ref="ns1:surname"/>
343 <xs:element maxOccurs="unbounded" ref="ns1:given"/>
344 <xs:element maxOccurs="unbounded" ref="ns1:additional"/>
345 <xs:element maxOccurs="unbounded" ref="ns1:prefix"/>
346 <xs:element maxOccurs="unbounded" ref="ns1:suffix"/>
350 <xs:element name="surname" type="xs:string"/>
351 <xs:element name="given" type="xs:string"/>
352 <xs:element name="additional" type="xs:string"/>
353 <xs:element name="prefix" type="xs:string"/>
354 <xs:element name="suffix" type="xs:string"/>
356 <xs:element name="nickname">
359 <xs:element minOccurs="0" name="parameters">
362 <xs:group ref="ns1:param-language"/>
363 <xs:group ref="ns1:param-altid"/>
364 <xs:group ref="ns1:param-pid"/>
365 <xs:group ref="ns1:param-pref"/>
366 <xs:group ref="ns1:param-type"/>
370 <xs:group ref="ns1:value-text-list"/>
375 <xs:element name="photo">
378 <xs:element minOccurs="0" name="parameters">
381 <xs:group ref="ns1:param-altid"/>
382 <xs:group ref="ns1:param-pid"/>
383 <xs:group ref="ns1:param-pref"/>
384 <xs:group ref="ns1:param-type"/>
385 <xs:group ref="ns1:param-mediatype"/>
389 <xs:element ref="ns1:uri"/>
394 <xs:element name="bday">
397 <xs:element minOccurs="0" name="parameters">
400 <xs:group ref="ns1:param-altid"/>
401 <xs:group ref="ns1:param-calscale"/>
406 <xs:element ref="ns1:value-date-and-or-time"/>
407 <xs:element ref="ns1:text"/>
413 <xs:element name="anniversary">
416 <xs:element minOccurs="0" name="parameters">
419 <xs:group ref="ns1:param-altid"/>
420 <xs:group ref="ns1:param-calscale"/>
425 <xs:element ref="ns1:value-date-and-or-time"/>
426 <xs:element ref="ns1:text"/>
432 <xs:element name="gender">
435 <xs:element ref="ns1:sex"/>
436 <xs:element minOccurs="0" ref="ns1:identity"/>
440 <xs:element name="sex">
442 <xs:restriction base="xs:token">
443 <xs:enumeration value=""/>
444 <xs:enumeration value="M"/>
445 <xs:enumeration value="F"/>
446 <xs:enumeration value="O"/>
447 <xs:enumeration value="N"/>
448 <xs:enumeration value="U"/>
452 <xs:element name="identity" type="xs:string"/>
454 <xs:group name="param-label">
456 <xs:element minOccurs="0" ref="ns1:label"/>
459 <xs:element name="label">
462 <xs:element ref="ns1:text"/>
466 <xs:element name="adr">
469 <xs:element minOccurs="0" name="parameters">
472 <xs:group ref="ns1:param-language"/>
473 <xs:group ref="ns1:param-altid"/>
474 <xs:group ref="ns1:param-pid"/>
475 <xs:group ref="ns1:param-pref"/>
476 <xs:group ref="ns1:param-type"/>
477 <xs:group ref="ns1:param-geo"/>
478 <xs:group ref="ns1:param-tz"/>
479 <xs:group ref="ns1:param-label"/>
483 <xs:element maxOccurs="unbounded" ref="ns1:pobox"/>
484 <xs:element maxOccurs="unbounded" ref="ns1:ext"/>
485 <xs:element maxOccurs="unbounded" ref="ns1:street"/>
486 <xs:element maxOccurs="unbounded" ref="ns1:locality"/>
487 <xs:element maxOccurs="unbounded" ref="ns1:region"/>
488 <xs:element maxOccurs="unbounded" ref="ns1:code"/>
489 <xs:element maxOccurs="unbounded" ref="ns1:country"/>
493 <xs:element name="pobox" type="xs:string"/>
494 <xs:element name="ext" type="xs:string"/>
495 <xs:element name="street" type="xs:string"/>
496 <xs:element name="locality" type="xs:string"/>
497 <xs:element name="region" type="xs:string"/>
498 <xs:element name="code" type="xs:string"/>
499 <xs:element name="country" type="xs:string"/>
501 <xs:element name="tel">
504 <xs:element minOccurs="0" name="parameters">
507 <xs:group ref="ns1:param-altid"/>
508 <xs:group ref="ns1:param-pid"/>
509 <xs:group ref="ns1:param-pref"/>
510 <xs:element minOccurs="0" name="type">
513 <xs:element maxOccurs="unbounded" name="text">
515 <xs:restriction base="xs:token">
516 <xs:enumeration value="work"/>
517 <xs:enumeration value="home"/>
518 <xs:enumeration value="text"/>
519 <xs:enumeration value="voice"/>
520 <xs:enumeration value="fax"/>
521 <xs:enumeration value="cell"/>
522 <xs:enumeration value="video"/>
523 <xs:enumeration value="pager"/>
524 <xs:enumeration value="textphone"/>
531 <xs:group ref="ns1:param-mediatype"/>
536 <xs:element ref="ns1:text"/>
537 <xs:element ref="ns1:uri"/>
543 <xs:element name="email">
546 <xs:element minOccurs="0" name="parameters">
549 <xs:group ref="ns1:param-altid"/>
550 <xs:group ref="ns1:param-pid"/>
551 <xs:group ref="ns1:param-pref"/>
552 <xs:group ref="ns1:param-type"/>
556 <xs:element ref="ns1:text"/>
561 <xs:element name="impp">
564 <xs:element minOccurs="0" name="parameters">
567 <xs:group ref="ns1:param-altid"/>
568 <xs:group ref="ns1:param-pid"/>
569 <xs:group ref="ns1:param-pref"/>
570 <xs:group ref="ns1:param-type"/>
571 <xs:group ref="ns1:param-mediatype"/>
575 <xs:element ref="ns1:uri"/>
580 <xs:element name="lang">
583 <xs:element minOccurs="0" name="parameters">
586 <xs:group ref="ns1:param-altid"/>
587 <xs:group ref="ns1:param-pid"/>
588 <xs:group ref="ns1:param-pref"/>
589 <xs:group ref="ns1:param-type"/>
593 <xs:element ref="ns1:language-tag"/>
598 <xs:group name="property-tz">
600 <xs:element name="tz">
603 <xs:element minOccurs="0" name="parameters">
606 <xs:group ref="ns1:param-altid"/>
607 <xs:group ref="ns1:param-pid"/>
608 <xs:group ref="ns1:param-pref"/>
609 <xs:group ref="ns1:param-type"/>
610 <xs:group ref="ns1:param-mediatype"/>
615 <xs:element ref="ns1:text"/>
616 <xs:element ref="ns1:uri"/>
617 <xs:element ref="ns1:utc-offset"/>
625 <xs:group name="property-geo">
627 <xs:element name="geo">
630 <xs:element minOccurs="0" name="parameters">
633 <xs:group ref="ns1:param-altid"/>
634 <xs:group ref="ns1:param-pid"/>
635 <xs:group ref="ns1:param-pref"/>
636 <xs:group ref="ns1:param-type"/>
637 <xs:group ref="ns1:param-mediatype"/>
641 <xs:element ref="ns1:uri"/>
648 <xs:element name="title">
651 <xs:element minOccurs="0" name="parameters">
654 <xs:group ref="ns1:param-language"/>
655 <xs:group ref="ns1:param-altid"/>
656 <xs:group ref="ns1:param-pid"/>
657 <xs:group ref="ns1:param-pref"/>
658 <xs:group ref="ns1:param-type"/>
662 <xs:element ref="ns1:text"/>
667 <xs:element name="role">
670 <xs:element minOccurs="0" name="parameters">
673 <xs:group ref="ns1:param-language"/>
674 <xs:group ref="ns1:param-altid"/>
675 <xs:group ref="ns1:param-pid"/>
676 <xs:group ref="ns1:param-pref"/>
677 <xs:group ref="ns1:param-type"/>
681 <xs:element ref="ns1:text"/>
686 <xs:element name="logo">
689 <xs:element minOccurs="0" name="parameters">
692 <xs:group ref="ns1:param-language"/>
693 <xs:group ref="ns1:param-altid"/>
694 <xs:group ref="ns1:param-pid"/>
695 <xs:group ref="ns1:param-pref"/>
696 <xs:group ref="ns1:param-type"/>
697 <xs:group ref="ns1:param-mediatype"/>
701 <xs:element ref="ns1:uri"/>
706 <xs:element name="org">
709 <xs:element minOccurs="0" name="parameters">
712 <xs:group ref="ns1:param-language"/>
713 <xs:group ref="ns1:param-altid"/>
714 <xs:group ref="ns1:param-pid"/>
715 <xs:group ref="ns1:param-pref"/>
716 <xs:group ref="ns1:param-type"/>
717 <xs:group ref="ns1:param-sort-as"/>
721 <xs:group ref="ns1:value-text-list"/>
726 <xs:element name="member">
729 <xs:element minOccurs="0" name="parameters">
732 <xs:group ref="ns1:param-altid"/>
733 <xs:group ref="ns1:param-pid"/>
734 <xs:group ref="ns1:param-pref"/>
735 <xs:group ref="ns1:param-mediatype"/>
739 <xs:element ref="ns1:uri"/>
744 <xs:element name="related">
747 <xs:element minOccurs="0" name="parameters">
750 <xs:group ref="ns1:param-altid"/>
751 <xs:group ref="ns1:param-pid"/>
752 <xs:group ref="ns1:param-pref"/>
753 <xs:element minOccurs="0" name="type">
756 <xs:element maxOccurs="unbounded" name="text">
758 <xs:restriction base="xs:token">
759 <xs:enumeration value="work"/>
760 <xs:enumeration value="home"/>
761 <xs:enumeration value="contact"/>
762 <xs:enumeration value="acquaintance"/>
763 <xs:enumeration value="friend"/>
764 <xs:enumeration value="met"/>
765 <xs:enumeration value="co-worker"/>
766 <xs:enumeration value="colleague"/>
767 <xs:enumeration value="co-resident"/>
768 <xs:enumeration value="neighbor"/>
769 <xs:enumeration value="child"/>
770 <xs:enumeration value="parent"/>
771 <xs:enumeration value="sibling"/>
772 <xs:enumeration value="spouse"/>
773 <xs:enumeration value="kin"/>
774 <xs:enumeration value="muse"/>
775 <xs:enumeration value="crush"/>
776 <xs:enumeration value="date"/>
777 <xs:enumeration value="sweetheart"/>
778 <xs:enumeration value="me"/>
779 <xs:enumeration value="agent"/>
780 <xs:enumeration value="emergency"/>
787 <xs:group ref="ns1:param-mediatype"/>
792 <xs:element ref="ns1:uri"/>
793 <xs:element ref="ns1:text"/>
799 <xs:element name="categories">
802 <xs:element minOccurs="0" name="parameters">
805 <xs:group ref="ns1:param-altid"/>
806 <xs:group ref="ns1:param-pid"/>
807 <xs:group ref="ns1:param-pref"/>
808 <xs:group ref="ns1:param-type"/>
812 <xs:group ref="ns1:value-text-list"/>
817 <xs:element name="note">
820 <xs:element minOccurs="0" name="parameters">
823 <xs:group ref="ns1:param-language"/>
824 <xs:group ref="ns1:param-altid"/>
825 <xs:group ref="ns1:param-pid"/>
826 <xs:group ref="ns1:param-pref"/>
827 <xs:group ref="ns1:param-type"/>
831 <xs:element ref="ns1:text"/>
836 <xs:element name="prodid">
839 <xs:element ref="ns1:text"/>
844 <xs:element name="rev" type="ns1:value-timestamp"/>
846 <xs:element name="sound">
849 <xs:element minOccurs="0" name="parameters">
852 <xs:group ref="ns1:param-language"/>
853 <xs:group ref="ns1:param-altid"/>
854 <xs:group ref="ns1:param-pid"/>
855 <xs:group ref="ns1:param-pref"/>
856 <xs:group ref="ns1:param-type"/>
857 <xs:group ref="ns1:param-mediatype"/>
861 <xs:element ref="ns1:uri"/>
866 <xs:element name="uid">
869 <xs:element ref="ns1:uri"/>
874 <xs:element name="clientpidmap">
877 <xs:element ref="ns1:sourceid"/>
878 <xs:element ref="ns1:uri"/>
882 <xs:element name="sourceid" type="xs:positiveInteger"/>
884 <xs:element name="url">
887 <xs:element minOccurs="0" name="parameters">
890 <xs:group ref="ns1:param-altid"/>
891 <xs:group ref="ns1:param-pid"/>
892 <xs:group ref="ns1:param-pref"/>
893 <xs:group ref="ns1:param-type"/>
894 <xs:group ref="ns1:param-mediatype"/>
898 <xs:element ref="ns1:uri"/>
903 <xs:element name="key">
906 <xs:element minOccurs="0" name="parameters">
909 <xs:group ref="ns1:param-altid"/>
910 <xs:group ref="ns1:param-pid"/>
911 <xs:group ref="ns1:param-pref"/>
912 <xs:group ref="ns1:param-type"/>
913 <xs:group ref="ns1:param-mediatype"/>
918 <xs:element ref="ns1:uri"/>
919 <xs:element ref="ns1:text"/>
925 <xs:element name="fburl">
928 <xs:element minOccurs="0" name="parameters">
931 <xs:group ref="ns1:param-altid"/>
932 <xs:group ref="ns1:param-pid"/>
933 <xs:group ref="ns1:param-pref"/>
934 <xs:group ref="ns1:param-type"/>
935 <xs:group ref="ns1:param-mediatype"/>
939 <xs:element ref="ns1:uri"/>
944 <xs:element name="caladruri">
947 <xs:element minOccurs="0" name="parameters">
950 <xs:group ref="ns1:param-altid"/>
951 <xs:group ref="ns1:param-pid"/>
952 <xs:group ref="ns1:param-pref"/>
953 <xs:group ref="ns1:param-type"/>
954 <xs:group ref="ns1:param-mediatype"/>
958 <xs:element ref="ns1:uri"/>
963 <xs:element name="caluri">
966 <xs:element minOccurs="0" name="parameters">
969 <xs:group ref="ns1:param-altid"/>
970 <xs:group ref="ns1:param-pid"/>
971 <xs:group ref="ns1:param-pref"/>
972 <xs:group ref="ns1:param-type"/>
973 <xs:group ref="ns1:param-mediatype"/>
977 <xs:element ref="ns1:uri"/>
981 <!-- Top-level grammar -->
982 <xs:group name="property">
984 <xs:element ref="ns1:adr"/>
985 <xs:element ref="ns1:anniversary"/>
986 <xs:element ref="ns1:bday"/>
987 <xs:element ref="ns1:caladruri"/>
988 <xs:element ref="ns1:caluri"/>
989 <xs:element ref="ns1:categories"/>
990 <xs:element ref="ns1:clientpidmap"/>
991 <xs:element ref="ns1:email"/>
992 <xs:element ref="ns1:fburl"/>
993 <xs:element ref="ns1:fn"/>
994 <xs:group ref="ns1:property-geo"/>
995 <xs:element ref="ns1:impp"/>
996 <xs:element ref="ns1:key"/>
997 <xs:element ref="ns1:kind"/>
998 <xs:element ref="ns1:lang"/>
999 <xs:element ref="ns1:logo"/>
1000 <xs:element ref="ns1:member"/>
1001 <xs:element ref="ns1:n"/>
1002 <xs:element ref="ns1:nickname"/>
1003 <xs:element ref="ns1:note"/>
1004 <xs:element ref="ns1:org"/>
1005 <xs:element ref="ns1:photo"/>
1006 <xs:element ref="ns1:prodid"/>
1007 <xs:element ref="ns1:related"/>
1008 <xs:element ref="ns1:rev"/>
1009 <xs:element ref="ns1:role"/>
1010 <xs:element ref="ns1:gender"/>
1011 <xs:element ref="ns1:sound"/>
1012 <xs:element ref="ns1:source"/>
1013 <xs:element ref="ns1:tel"/>
1014 <xs:element ref="ns1:title"/>
1015 <xs:group ref="ns1:property-tz"/>
1016 <xs:element ref="ns1:uid"/>
1017 <xs:element ref="ns1:url"/>
1020 <xs:element name="vcards">
1023 <xs:element maxOccurs="unbounded" ref="ns1:vcard"/>
1027 <xs:element name="vcard">
1029 <xs:choice maxOccurs="unbounded">
1030 <xs:group ref="ns1:property"/>
1031 <xs:element ref="ns1:group"/>
1035 <xs:element name="group">
1037 <xs:group minOccurs="0" maxOccurs="unbounded" ref="ns1:property"/>
1038 <xs:attribute name="name" use="required"/>