使用ref时,我可以使用XML Schema吗?

时间:2012-03-21 10:58:09

标签: xml xsd unique-constraint

Visual Studio给了我一个错误,我看不出它真的违反了XML模式定义。

当我对一个集合有一个独特的约束时,我引用它的元素

When the ref attribute is present, the type attribute and complexType, simpleType, key, keyref, and unique elements cannot be present. 

这是正确的吗?如果是这样,我是否被迫在其父元素中声明子元素?

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

    <xs:simpleType name="titletype">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Warlord"/>
            <xs:enumeration value="FirstMate"/>
            <xs:enumeration value="Jester"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="warlord">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="warlordName" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="title" type="titletype" />
        </xs:complexType>
    </xs:element>

    <xs:element name="warband">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="warbandName" type="xs:string" />
            <xs:element name="warlords">
              <xs:complexType>
                <xs:sequence>
                  <xs:element ref="warlord" minOccurs="1" maxOccurs="unbounded">
                    <xs:unique name="eachTitleOnlyOnce">
                        <xs:selector xpath="warlord"/>
                        <xs:field xpath="@title"/>
                    </xs:unique>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

我使用的是唯一正确的吗?

修改

这个怎么样:

<xs:complexType  name="warlordtype">
    <xs:simpleContent>
      <xs:extension base="xs:string">
          <xs:attribute name="title" type="titletype" />
      </xs:extension>
    </xs:simpleContent>
</xs:complexType>

    <xs:element name="warband">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="warbandName" type="xs:string" />
            <xs:element name="warlords">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="warlord" type="warlordtype" minOccurs="1" maxOccurs="unbounded">
                    <xs:unique name="eachTitleOnlyOnce">
                        <xs:selector xpath="warlord"/>
                        <xs:field xpath="@title"/>
                    </xs:unique>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
    </xs:element>

为什么这不起作用?

2 个答案:

答案 0 :(得分:2)

唯一元素不能在ref元素中。查看element definition.

你能用这个:

<xs:schema xmlns="http://mysticwarlords.kaa/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://mysticwarlords.kaa/XMLSchema">
<xs:simpleType name="titletype">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Warlord"/>
        <xs:enumeration value="FirstMate"/>
        <xs:enumeration value="Jester"/>
    </xs:restriction>
</xs:simpleType>
<xs:element name="warlord">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="warlordName" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="title" type="titletype"/>
    </xs:complexType>
    <xs:unique name="eachTitleOnlyOnce">
        <xs:selector xpath="warlord"/>
        <xs:field xpath="@title"/>
    </xs:unique>
</xs:element>
<xs:element name="warband">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="warbandName" type="xs:string"/>
            <xs:element name="warlords">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="warlord" minOccurs="1" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

答案 1 :(得分:1)

某个元素的唯一约束必须始终出现在包含元素中。 你可能想表达的是这样的:“一个军阀元素的孩子(这些孩子是军阀元素)必须有一个独特的标题”
如果你改变你的xsd,它应该工作:

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

    <xs:simpleType name="titletype">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Warlord"/>
            <xs:enumeration value="FirstMate"/>
            <xs:enumeration value="Jester"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="warlord">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="warlordName" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="title" type="titletype" />
        </xs:complexType>
    </xs:element>

    <xs:element name="warband">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="warbandName" type="xs:string" />
                <xs:element name="warlords">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="warlord" minOccurs="1" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                    <xs:unique name="eachTitleOnlyOnce">
                        <xs:selector xpath="warlord"/>
                        <xs:field xpath="@title"/>
                    </xs:unique>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>