XSD для альтернативных корневых элементов из разных пространств имен?

XML-схема версии 1.0 может указывать альтернативные корневые узлы для экземпляров благодаря тому факту, что не существует единого определения корневого узла:

https://stackoverflow.com/a/8857777/8254682

Таким образом, можно использовать это, чтобы обеспечить своего рода «выбор типа документа» без использования XSD V1.1., основываясь на том, какой из нескольких глобально объявленных элементов используется в экземпляре в качестве корневого узла, верно?

Но могут ли «альтернативные корневые узлы» находиться в разных пространствах имен, если эти пространства имен объявлены правильно? Имеет ли в этом случае значение квалификация элемента и атрибута?


person Michael    schedule 24.07.2017    source источник


Ответы (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-документа 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-документа 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-документа 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>
person Sprotty    schedule 25.07.2017