XSD для альтернативных корневых элементов из разных пространств имен?
XML-схема V1.0 может указывать альтернативные корневые узлы для экземпляров в силу того, что не существует единого определения корневого узла:
/questions/35651001/shema-xml-kornevoj-element/35651012#35651012
Таким образом, можно использовать это для обеспечения своего рода "выбора типа документа" без использования XSD V1.1., В зависимости от того, какой из нескольких глобально объявленных элементов используется в экземпляре в качестве корневого узла, верно?
Но могут ли "альтернативные корневые узлы" находиться в разных пространствах имен, если эти пространства имен объявлены правильно? Имеет ли значение квалификация элемента и атрибута в этом случае?
1 ответ
Любой корневой элемент (который не является абстрактным) может использоваться в качестве определения корневого элемента в документе XML.
Кроме того, вы можете сохранить то же имя корневого элемента и изменить тип элемента, используя атрибут xsi:type в документе XML (используемый тип должен основываться на типе, определенном в RootElm).
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2018 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="RootElm" type="RootType" />
<xs:complexType name="RootType">
<xs:sequence>
<xs:element name="A" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="RootType1">
<xs:complexContent>
<xs:extension base="RootType">
<xs:sequence>
<xs:element name="B" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="RootType2">
<xs:complexContent>
<xs:extension base="RootType">
<xs:sequence>
<xs:element name="C" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Образец XML Doc 1
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2018 (https://www.liquid-technologies.com) -->
<RootElm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:\Temp\XSDFile1.xsd">
<A />
</RootElm>
Образец XML Doc 2
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2018 (https://www.liquid-technologies.com) -->
<RootElm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:\Temp\XSDFile1.xsd"
xsi:type="RootType1">
<A />
<B></B>
</RootElm>
Образец XML Doc 3
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2018 (https://www.liquid-technologies.com) -->
<RootElm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:\Temp\XSDFile1.xsd"
xsi:type="RootType2">
<A />
<C />
</RootElm>