простой XML-тип с перечислением и объединением - PullRequest
3 голосов
/ 22 апреля 2011

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

атрибут элемента: ошибка синтаксического анализатора схем: атрибут decl. «текущее состояние», атрибут «тип»: значение QName «закрытое состояние» не разрешается в (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» для атрибута текущего состояния.

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

Ответы [ 2 ]

5 голосов
/ 22 апреля 2011

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

    <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>

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

2 голосов
/ 22 апреля 2011

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

...