Verify MCA tags.
authorCarl Hetherington <cth@carlh.net>
Tue, 8 Sep 2020 18:42:55 +0000 (20:42 +0200)
committerCarl Hetherington <cth@carlh.net>
Sun, 20 Sep 2020 23:18:30 +0000 (01:18 +0200)
src/verify.cc
xsd/SMPTE-335-2012.xsd [new file with mode: 0644]
xsd/SMPTE-395-2014-13-1-aaf.xsd [new file with mode: 0644]
xsd/SMPTE-429-12-2008.xsd [new file with mode: 0644]
xsd/isdcf-mca.xsd [new file with mode: 0644]
xsd/xlink.xsd [new file with mode: 0644]

index f888c62d17af82ea9b3f89c2898fa87fc0eff8cc..0b48ce246337a0941678e303e849a67660ef7548 100644 (file)
@@ -196,6 +196,9 @@ public:
        LocalFileResolver (boost::filesystem::path xsd_dtd_directory)
                : _xsd_dtd_directory (xsd_dtd_directory)
        {
+               /* XXX: I'm not clear on what things need to be in this list; some XSDs are apparently, magically
+                * found without being here.
+                */
                add("http://www.w3.org/2001/XMLSchema.dtd", "XMLSchema.dtd");
                add("http://www.w3.org/2001/03/xml.xsd", "xml.xsd");
                add("http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd", "xmldsig-core-schema.xsd");
@@ -273,6 +276,7 @@ validate_xml (T xml, boost::filesystem::path xsd_dtd_directory, list<Verificatio
                parser.setDoSchema(true);
 
                vector<string> schema;
+               schema.push_back("xml.xsd");
                schema.push_back("xmldsig-core-schema.xsd");
                schema.push_back("SMPTE-429-7-2006-CPL.xsd");
                schema.push_back("SMPTE-429-8-2006-PKL.xsd");
@@ -287,8 +291,16 @@ validate_xml (T xml, boost::filesystem::path xsd_dtd_directory, list<Verificatio
                schema.push_back("SMPTE-429-16.xsd");
                schema.push_back("Dolby-2012-AD.xsd");
                schema.push_back("SMPTE-429-10-2008.xsd");
-
-               /* XXX: I'm not especially clear what this is for, but it seems to be necessary */
+               schema.push_back("xlink.xsd");
+               schema.push_back("SMPTE-335-2012.xsd");
+               schema.push_back("SMPTE-395-2014-13-1-aaf.xsd");
+               schema.push_back("isdcf-mca.xsd");
+               schema.push_back("SMPTE-429-12-2008.xsd");
+
+               /* XXX: I'm not especially clear what this is for, but it seems to be necessary.
+                * Schemas that are not mentioned in this list are not read, and the things
+                * they describe are not checked.
+                */
                string locations;
                BOOST_FOREACH (string i, schema) {
                        locations += String::compose("%1 %1 ", i, i);
@@ -561,6 +573,8 @@ dcp::verify (
                        notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::GENERAL_READ, string(e.what())));
                } catch (XMLError& e) {
                        notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::GENERAL_READ, string(e.what())));
+               } catch (MXFFileError& e) {
+                       notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::GENERAL_READ, string(e.what())));
                } catch (cxml::Error& e) {
                        notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::GENERAL_READ, string(e.what())));
                }
diff --git a/xsd/SMPTE-335-2012.xsd b/xsd/SMPTE-335-2012.xsd
new file mode 100644 (file)
index 0000000..a147f90
--- /dev/null
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+       xmlns:r0="http://www.smpte-ra.org/reg/2003/2012"
+       xmlns:xlink="http://www.w3.org/1999/xlink"
+       attributeFormDefault="unqualified"
+       elementFormDefault="qualified"
+       targetNamespace="http://www.smpte-ra.org/reg/335/2012"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xmlns:r1="http://www.smpte-ra.org/reg/335/2012">
+
+<xs:import namespace="http://www.smpte-ra.org/reg/2003/2012"/>
+<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>
+
+<xs:simpleType name="UUID">
+<xs:restriction base="xs:anyURI">
+<xs:pattern value="urn:uuid:[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}"/>
+</xs:restriction>
+</xs:simpleType>
+
+<xs:complexType name="UUIDArray">
+<xs:sequence>
+<xs:element maxOccurs="unbounded" minOccurs="0" name="Thing" type="r1:UUID"/>
+</xs:sequence>
+</xs:complexType>
+
+<xs:attribute name='escaped' type='xs:boolean'/>
+
+<xs:complexType name="UTF16String">
+<xs:simpleContent>
+<xs:extension base="xs:string">
+<xs:attribute ref="r1:escaped" use="optional"/>
+</xs:extension>
+</xs:simpleContent>
+</xs:complexType>
+
+<xs:simpleType name='AUID'>
+    <xs:restriction base='xs:anyURI'>
+        <xs:pattern 
+                value='urn:smpte:ul:([0-9a-fA-F]{8}\.){3}[0-9a-fA-F]{8}'/>
+        <xs:pattern 
+            value='urn:uuid:[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}'/>
+    </xs:restriction>
+</xs:simpleType>
+
+<xs:complexType name="ISO7">
+<xs:simpleContent>
+<xs:extension base="xs:string">
+<xs:attribute ref="r1:escaped" use="optional"/>
+</xs:extension>
+</xs:simpleContent>
+</xs:complexType>
+
+<xs:simpleType name="UInt32">
+<xs:union>
+<xs:simpleType>
+<xs:restriction base="xs:unsignedInt"/>
+</xs:simpleType>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:pattern value="0x[0-9a-fA-F]{1,8}"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:union>
+</xs:simpleType>
+
+<xs:element name="GroupOfSoundfieldGroupsLinkID" type="r1:UUIDArray"/>
+<xs:element name="MCALinkID" type="r1:UUID"/>
+<xs:element name="MCATagName" type="r1:UTF16String"/>
+<xs:element name="MCATitleSubVersion" type="r1:UTF16String"/>
+<xs:element name="MCALabelDictionaryID" type="r1:AUID"/>
+<xs:element name="MCATagSymbol" type="r1:UTF16String"/>
+<xs:element name="RFC5646SpokenLanguage" type="r1:ISO7"/>
+<xs:element name="MCAPartitionKind" type="r1:UTF16String"/>
+<xs:element name="MCAPartitionNumber" type="r1:UTF16String"/>
+<xs:element name="MCATitleVersion" type="r1:UTF16String"/>
+<xs:element name="MCAAudioContentKind" type="r1:UTF16String"/>
+<xs:element name="MCAAudioElementKind" type="r1:UTF16String"/>
+<xs:element name="MCAEpisode" type="r1:UTF16String"/>
+<xs:element name="MCAChannelID" type="r1:UInt32"/>
+<xs:element name="InstanceID" type="r1:UUID"/>
+<xs:element name="LinkedGenerationID" type="r1:AUID"/>
+<xs:element name="MCATitle" type="r1:UTF16String"/>
+<xs:element name="SoundfieldGroupLinkID" type="r1:UUID"/>
+
+</xs:schema>
diff --git a/xsd/SMPTE-395-2014-13-1-aaf.xsd b/xsd/SMPTE-395-2014-13-1-aaf.xsd
new file mode 100644 (file)
index 0000000..0037e43
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?><!--Created: Mon Sep 07 16:19:25 UTC 2020--><!--By: regxmllib build ff4e9909fc235f2cb20118cc967786fb46ca7e60--><xs:schema xmlns:r0="http://www.smpte-ra.org/reg/335/2012" xmlns:r1="http://www.smpte-ra.org/reg/335/2012/13/1/aaf" xmlns:r2="http://www.smpte-ra.org/reg/335/2012/13/1/amwa/rules" xmlns:r3="http://www.smpte-ra.org/reg/335/2012/13/4/archive" xmlns:r4="http://www.loc.gov/avconservation" xmlns:xlink="http://www.w3.org/1999/xlink" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.smpte-ra.org/reg/395/2014/13/1/aaf" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+<xs:import namespace="http://www.smpte-ra.org/reg/335/2012"/>
+
+<xs:element name="AudioChannelLabelSubDescriptor">
+<xs:complexType>
+<xs:all>
+<xs:element minOccurs="0" ref="r0:SoundfieldGroupLinkID"/>
+<xs:element ref="r0:MCALinkID"/>
+<xs:element minOccurs="0" ref="r0:MCATagName"/>
+<xs:element minOccurs="0" ref="r0:MCATitle"/>
+<xs:element minOccurs="0" ref="r0:MCATitleSubVersion"/>
+<xs:element ref="r0:MCALabelDictionaryID"/>
+<xs:element ref="r0:MCATagSymbol"/>
+<xs:element minOccurs="0" ref="r0:RFC5646SpokenLanguage"/>
+<xs:element minOccurs="0" ref="r0:MCAPartitionNumber"/>
+<xs:element minOccurs="0" ref="r0:MCAPartitionKind"/>
+<xs:element minOccurs="0" ref="r0:MCATitleVersion"/>
+<xs:element minOccurs="0" ref="r0:MCAAudioElementKind"/>
+<xs:element minOccurs="0" ref="r0:MCAAudioContentKind"/>
+<xs:element minOccurs="0" ref="r0:MCAEpisode"/>
+<xs:element minOccurs="0" ref="r0:MCAChannelID"/>
+<xs:element minOccurs="0" ref="r0:InstanceID"/>
+</xs:all>
+</xs:complexType>
+</xs:element>
+
+<xs:element name="SoundfieldGroupLabelSubDescriptor">
+<xs:complexType>
+<xs:all>
+<xs:element minOccurs="0" ref="r0:GroupOfSoundfieldGroupsLinkID"/>
+<xs:element ref="r0:MCALinkID"/>
+<xs:element minOccurs="0" ref="r0:MCATagName"/>
+<xs:element minOccurs="0" ref="r0:MCATitle"/>
+<xs:element minOccurs="0" ref="r0:MCATitleSubVersion"/>
+<xs:element ref="r0:MCALabelDictionaryID"/>
+<xs:element ref="r0:MCATagSymbol"/>
+<xs:element minOccurs="0" ref="r0:RFC5646SpokenLanguage"/>
+<xs:element minOccurs="0" ref="r0:MCAPartitionNumber"/>
+<xs:element minOccurs="0" ref="r0:MCAPartitionKind"/>
+<xs:element minOccurs="0" ref="r0:MCATitleVersion"/>
+<xs:element minOccurs="0" ref="r0:MCAAudioElementKind"/>
+<xs:element minOccurs="0" ref="r0:MCAAudioContentKind"/>
+<xs:element minOccurs="0" ref="r0:MCAEpisode"/>
+<xs:element minOccurs="0" ref="r0:MCAChannelID"/>
+<xs:element minOccurs="0" ref="r0:InstanceID"/>
+</xs:all>
+</xs:complexType>
+</xs:element>
+
+</xs:schema>
diff --git a/xsd/SMPTE-429-12-2008.xsd b/xsd/SMPTE-429-12-2008.xsd
new file mode 100644 (file)
index 0000000..8fd8cd8
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.smpte-ra.org/schemas/429-12/2008/TT"
+xmlns:xs="http://www.w3.org/2001/XMLSchema"
+xmlns:cpl="http://www.smpte-ra.org/schemas/429-7/2006/CPL"
+xmlns:tt="http://www.smpte-ra.org/schemas/429-12/2008/TT"
+elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:import namespace="http://www.smpte-ra.org/schemas/429-7/2006/CPL"/>
+<!-- MainCaption -->
+<xs:element name="MainCaption" type="tt:CaptionTrackFileAssetType"/>
+<!-- ClosedCaption -->
+<xs:element name="ClosedCaption" type="tt:CaptionTrackFileAssetType"/>
+<!-- CaptionTrackFileAssetType -->
+<xs:complexType name="CaptionTrackFileAssetType">
+<xs:complexContent>
+<xs:extension base="cpl:TrackFileAssetType">
+<xs:sequence>
+<xs:element name="Language" type="xs:language" minOccurs="0"/>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<!-- ClosedSubtitle -->
+<xs:element name="ClosedSubtitle" type="cpl:SubtitleTrackFileAssetType"/>
+</xs:schema>
diff --git a/xsd/isdcf-mca.xsd b/xsd/isdcf-mca.xsd
new file mode 100644 (file)
index 0000000..1714cca
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified" targetNamespace="http://isdcf.com/ns/cplmd/mca" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:r0="http://www.smpte-ra.org/reg/395/2014/13/1/aaf" xmlns:r1="http://www.smpte-ra.org/reg/335/2012">
+
+<xs:import namespace="http://www.smpte-ra.org/reg/395/2014/13/1/aaf"/>
+<xs:import namespace="http://www.smpte-ra.org/reg/335/2012"/>
+
+  <xs:element name="MCASubDescriptors">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded" minOccurs="0">
+        <xs:element ref="r0:SoundfieldGroupLabelSubDescriptor"/>
+        <xs:element ref="r0:AudioChannelLabelSubDescriptor"/>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+
+</xs:schema>
diff --git a/xsd/xlink.xsd b/xsd/xlink.xsd
new file mode 100644 (file)
index 0000000..bc7f31e
--- /dev/null
@@ -0,0 +1,270 @@
+<?xml version='1.0' encoding='UTF-8'?>\r
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink">\r
\r
+ <xs:annotation>\r
+  <xs:documentation>This schema document provides attribute declarations and\r
+attribute group, complex type and simple type definitions which can be used in\r
+the construction of user schemas to define the structure of particular linking\r
+constructs, e.g.\r
+<![CDATA[\r
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"\r
+           xmlns:xl="http://www.w3.org/1999/xlink">\r
+\r
+ <xs:import namespace="http://www.w3.org/1999/xlink"\r
+            location="http://www.w3.org/1999/xlink.xsd">\r
+\r
+ <xs:element name="mySimple">\r
+  <xs:complexType>\r
+   ...\r
+   <xs:attributeGroup ref="xl:simpleAttrs"/>\r
+   ...\r
+  </xs:complexType>\r
+ </xs:element>\r
+ ...\r
+</xs:schema>]]></xs:documentation>\r
+ </xs:annotation>\r
+\r
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>\r
+\r
+ <xs:attribute name="type" type="xlink:typeType"/>\r
+\r
+ <xs:simpleType name="typeType">\r
+  <xs:restriction base="xs:token">\r
+   <xs:enumeration value="simple"/>\r
+   <xs:enumeration value="extended"/>\r
+   <xs:enumeration value="title"/>\r
+   <xs:enumeration value="resource"/>\r
+   <xs:enumeration value="locator"/>\r
+   <xs:enumeration value="arc"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="href" type="xlink:hrefType"/>\r
+\r
+ <xs:simpleType name="hrefType">\r
+  <xs:restriction base="xs:anyURI"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="role" type="xlink:roleType"/>\r
+\r
+ <xs:simpleType name="roleType">\r
+  <xs:restriction base="xs:anyURI">\r
+   <xs:minLength value="1"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="arcrole" type="xlink:arcroleType"/>\r
+\r
+ <xs:simpleType name="arcroleType">\r
+  <xs:restriction base="xs:anyURI">\r
+   <xs:minLength value="1"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="title" type="xlink:titleAttrType"/>\r
+\r
+ <xs:simpleType name="titleAttrType">\r
+  <xs:restriction base="xs:string"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="show" type="xlink:showType"/>\r
+\r
+ <xs:simpleType name="showType">\r
+  <xs:restriction base="xs:token">\r
+   <xs:enumeration value="new"/>\r
+   <xs:enumeration value="replace"/>\r
+   <xs:enumeration value="embed"/>\r
+   <xs:enumeration value="other"/>\r
+   <xs:enumeration value="none"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="actuate" type="xlink:actuateType"/>\r
+\r
+ <xs:simpleType name="actuateType">\r
+  <xs:restriction base="xs:token">\r
+   <xs:enumeration value="onLoad"/>\r
+   <xs:enumeration value="onRequest"/>\r
+   <xs:enumeration value="other"/>\r
+   <xs:enumeration value="none"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="label" type="xlink:labelType"/>\r
+\r
+ <xs:simpleType name="labelType">\r
+  <xs:restriction base="xs:NCName"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="from" type="xlink:fromType"/>\r
+\r
+ <xs:simpleType name="fromType">\r
+  <xs:restriction base="xs:NCName"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="to" type="xlink:toType"/>\r
+\r
+ <xs:simpleType name="toType">\r
+  <xs:restriction base="xs:NCName"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attributeGroup name="simpleAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="simple"/>\r
+  <xs:attribute ref="xlink:href"/>\r
+  <xs:attribute ref="xlink:role"/>\r
+  <xs:attribute ref="xlink:arcrole"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+  <xs:attribute ref="xlink:show"/>\r
+  <xs:attribute ref="xlink:actuate"/>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="simpleModel">\r
+  <xs:sequence>\r
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType mixed="true" name="simple">\r
+  <xs:annotation>\r
+   <xs:documentation>\r
+    Intended for use as the type of user-declared elements to make them\r
+    simple links.\r
+   </xs:documentation>\r
+  </xs:annotation>\r
+  <xs:group ref="xlink:simpleModel"/>\r
+  <xs:attributeGroup ref="xlink:simpleAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:attributeGroup name="extendedAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="extended" use="required"/>\r
+  <xs:attribute ref="xlink:role"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="extendedModel">\r
+   <xs:choice>\r
+    <xs:element ref="xlink:title"/>\r
+    <xs:element ref="xlink:resource"/>\r
+    <xs:element ref="xlink:locator"/>\r
+    <xs:element ref="xlink:arc"/>\r
+  </xs:choice>\r
+ </xs:group>\r
+\r
+ <xs:complexType name="extended">\r
+  <xs:annotation>\r
+   <xs:documentation>\r
+    Intended for use as the type of user-declared elements to make them\r
+    extended links.\r
+    Note that the elements referenced in the content model are all abstract.\r
+    The intention is that by simply declaring elements with these as their\r
+    substitutionGroup, all the right things will happen.\r
+   </xs:documentation>\r
+  </xs:annotation>\r
+  <xs:group ref="xlink:extendedModel" minOccurs="0" maxOccurs="unbounded"/>\r
+  <xs:attributeGroup ref="xlink:extendedAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:element name="title" type="xlink:titleEltType" abstract="true"/>\r
+\r
+ <xs:attributeGroup name="titleAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="title" use="required"/>\r
+  <xs:attribute ref="xml:lang">\r
+   <xs:annotation>\r
+    <xs:documentation>\r
+     xml:lang is not required, but provides much of the\r
+     motivation for title elements in addition to attributes, and so\r
+     is provided here for convenience.\r
+    </xs:documentation>\r
+   </xs:annotation>\r
+  </xs:attribute>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="titleModel">\r
+  <xs:sequence>\r
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType mixed="true" name="titleEltType">\r
+  <xs:group ref="xlink:titleModel"/>\r
+  <xs:attributeGroup ref="xlink:titleAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:element name="resource" type="xlink:resourceType" abstract="true"/>\r
+\r
+ <xs:attributeGroup name="resourceAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="resource" use="required"/>\r
+  <xs:attribute ref="xlink:role"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+  <xs:attribute ref="xlink:label"/>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="resourceModel">\r
+  <xs:sequence>\r
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType mixed="true" name="resourceType">\r
+  <xs:group ref="xlink:resourceModel"/>\r
+  <xs:attributeGroup ref="xlink:resourceAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:element name="locator" type="xlink:locatorType" abstract="true"/>\r
+\r
+ <xs:attributeGroup name="locatorAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="locator" use="required"/>\r
+  <xs:attribute ref="xlink:href" use="required"/>\r
+  <xs:attribute ref="xlink:role"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+  <xs:attribute ref="xlink:label">\r
+   <xs:annotation>\r
+    <xs:documentation>\r
+     label is not required, but locators have no particular\r
+     XLink function if they are not labeled.\r
+    </xs:documentation>\r
+   </xs:annotation>\r
+  </xs:attribute>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="locatorModel">\r
+  <xs:sequence>\r
+   <xs:element ref="xlink:title" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType name="locatorType">\r
+  <xs:group ref="xlink:locatorModel"/>\r
+  <xs:attributeGroup ref="xlink:locatorAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:element name="arc" type="xlink:arcType" abstract="true"/>\r
+\r
+ <xs:attributeGroup name="arcAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="arc" use="required"/>\r
+  <xs:attribute ref="xlink:arcrole"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+  <xs:attribute ref="xlink:show"/>\r
+  <xs:attribute ref="xlink:actuate"/>\r
+  <xs:attribute ref="xlink:from"/>\r
+  <xs:attribute ref="xlink:to">\r
+   <xs:annotation>\r
+    <xs:documentation>\r
+     from and to have default behavior when values are missing\r
+    </xs:documentation>\r
+   </xs:annotation>\r
+  </xs:attribute>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="arcModel">\r
+  <xs:sequence>\r
+   <xs:element ref="xlink:title" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType name="arcType">\r
+  <xs:group ref="xlink:arcModel"/>\r
+  <xs:attributeGroup ref="xlink:arcAttrs"/>\r
+ </xs:complexType>\r
+\r
+</xs:schema>\r