xml простой тип с перечислением и объединением

синтаксический анализ следующей схемы xml приводит к этой ошибке:

атрибут элемента: ошибка синтаксического анализатора схем: атрибут decl. 'current-state', атрибут 'type': значение QName 'covered-state' не разрешается в (n) простое определение типа. Не удалось скомпилировать схему WXS memory.xsd

Вот ответственный код:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.com">

    <xsd:simpleType name="covered-state">
        <xsd:union>
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer">
                    <xsd:enumeration value="0"/>
                    <xsd:enumeration value="1"/>
                </xsd:restriction>
            </xsd:simpleType>
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="COVERED"/>
                    <xsd:enumeration value="UNCOVERED"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:union>
    </xsd:simpleType>

    <xsd:complexType name="MemoryCard">
        <xsd:attribute name="current-state" type="covered-state" use="required"/> <!-- here i get the error -->
    </xsd:complexType>

</xsd:schema>

Итак, что это должно сделать, так это объединить перечисление строк и целых чисел, чтобы файл xml принимал «0», «1», «COVERED» или «UNCOVERED» для текущего состояния атрибута.

Может ли кто-нибудь указать мне в правильном направлении? Спасибо!


person hooch    schedule 21.04.2011    source источник
comment
ммм, хорошо, я уже заставил это работать .. я хотел бы опубликовать ответ, но как новый идентификатор пользователя придется ждать еще 8 часов. так что, может быть, если я вспомню, я отправлю его. может поможет кому с похожей проблемой.   -  person hooch    schedule 22.04.2011


Ответы (2)


ваши предложения тоже будут работать, но я решил это так:

    <xsd:attribute name="current-state" use="required">
        <xsd:simpleType>    
            <xsd:union>
                <xsd:simpleType>
                    <xsd:restriction base="xsd:integer">
                        <xsd:enumeration value="0"/>
                        <xsd:enumeration value="1"/>
                    </xsd:restriction>
                </xsd:simpleType>
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="COVERED"/>
                        <xsd:enumeration value="UNCOVERED"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:union>
        </xsd:simpleType>
    </xsd:attribute>

Спасибо, в любом случае!

person hooch    schedule 22.04.2011

type="covered-state" — это ссылка на тип без пространства имен, но вам нужна ссылка на тип с локальным именем "covered-state" в пространстве имен "http://www.example.com". Для этого вам нужно привязать префикс (например, e) к этому пространству имен и обращаться к нему как type="e:covered-state".

person Michael Kay    schedule 22.04.2011
comment
В качестве альтернативы можно удалить целевое пространство имен в элементе xsd:schema. Я полагаю, зависит от того, действительно ли пространство имен имеет значение. - person james.garriss; 18.02.2016