XML схема и проблема при вытекании из смешанного типа

StackOverflow https://stackoverflow.com/questions/3889091

  •  28-09-2019
  •  | 
  •  

Вопрос

У меня после XML-схемы:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="content" type="contentType"/>

    <xs:complexType name="contentType">
        <xs:complexContent>
            <xs:extension base="versionedElementType">  
                <xs:sequence>   
                    <xs:element name="item" type="itemType" minOccurs="1" maxOccurs="unbounded" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="itemType" mixed="true"> 
        <xs:complexContent>
            <xs:extension base="itemTypeBase">
                    <xs:sequence>   
                        <xs:element name="order" type="xs:unsignedInt"/>
                        <xs:element name="id" type="xs:string"/>
                    </xs:sequence>
            </xs:extension> 
        </xs:complexContent>
    </xs:complexType>

    <!-- Simple type convert to complex type -->
    <xs:complexType name="itemTypeBase" mixed="true">
        <xs:simpleContent>  
            <xs:extension base="itemDescriptionType">
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <!-- Simple type -string restriction -->
    <xs:simpleType name="itemDescriptionType" >
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="64"/>
        </xs:restriction>   
    </xs:simpleType>


    <xs:complexType name="versionedElementType">
        <xs:attribute name="version" type="xs:string" use="required"/>
    </xs:complexType>

</xs:schema>

Что я использую для проверки этого экземпляра XML (я хочу смешивать текст в элементе «элемента» с порядком подразделения «и« ID »):

<?xml version="1.0" encoding="UTF-8"?>
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="Content.xsd"
         version ="1.0">

  <item>Description here...
  <order>2</order>
  <id>2</id>
  </item>  
</content>

Все, что я сделал, что я сделал, все еще говорит, что TAHT есть ошибка:

Тип содержимого производного типа и ее основания должен быть только смешанным, либо как только для элемента. Тип «itemType» смешан, но его базовый тип не является.

Но я вижу, что оба типа - itemType и itemtypebase смешаны!

Спасибо много

Это было полезно?

Решение

Прежде всего ошибка, которую я вижу, если я открываю свою схему в Visual Studio 2010:

Полученный тип и на основе на основе на базе должны иметь тот же тип контента.

В вашей текущей схеме тип itemTypeBase определяется с уважением <xs:simpleContent> и полученный тип itemType с уважением <xs:complexContent> который не допускается. Либо вы не разрешаете никаких подэлементов и использования <xs:simpleContent> или вы используете дочерние элементы и использовать <xs:complexContent>.

Я лично не люблю и не использую смешанные типы. Если я пойму, вы правильно, вы хотите сделать некоторые ограничения в тексте из контента. Вы хотите иметь длину содержимого от 1 до 64 символов. Но <order>2</order>, <id>2</id> И все пробелы, включающие новые символы линии, также являются частью содержания. Если вы хотите, чтобы это <item> Имеет простой контент, то вы не можете вставить дочерние элементы внутри.

Таким образом, прагматичное решение будет уходить от смешанной модели и использовать документ XML в форме

<?xml version="1.0" encoding="utf-8"?>
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="Content.xsd"
         version ="1.0">
    <item>
        <description>Description here...</description>
        <order>2</order>
        <id>2</id>
    </item>
</content>

где содержится контент.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="content" type="contentType"/>

    <xs:complexType name="contentType">
        <xs:sequence>   
            <xs:element name="item" type="itemType"
                        minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="version" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:complexType name="itemType"> 
        <xs:sequence>
            <xs:element name="description" type="itemDescriptionType"/>
            <xs:element name="order" type="xs:unsignedInt"/>
            <xs:element name="id" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="itemDescriptionType" >
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="64"/>
        </xs:restriction>   
    </xs:simpleType>

</xs:schema>

Все будет очень простым и ясным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top