2012-03-21 4 views
0

Visual Studio дала мне ошибку, которую я не вижу, действительно против определения схемы XML.XML Schema можно использовать при использовании ref?

Когда у меня есть уникальное ограничение на коллекции, какой элемент я Ref ему говорит

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> 

Я использую Unique правильно?

EDIT

Что об этом:

<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

Уникальный элемент не может быть в элементе 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> 

+0

Не знаю, могу ли я: P Таким образом, я мог бы объявить уникальное внутри элемента. Что делать, если бы я использовал элемент в более чем одном месте и был бы единственным уникальным в одной из этих коллекций? –

+0

Я не думаю, что это возможно в XSD. Вы можете использовать тип повторного использования (http://www.codeproject.com/Articles/11057/XSD-Using-the-include-element-for-schematic-reuse), но не уникальный. Также родительский элемент для [unique] (http://www.w3schools.com/schema/el_unique.asp) может быть только «элементом». –

+0

Что делать, если я делаю военачальника как тип, почему бы не уникальную работу, как я мог заставить ее работать? –

1

Уникальное ограничение для определенного элемента всегда должно появляться в вмещающем элементе. То, что вы, вероятно, хотите, чтобы выразить что-то вроде этого: «Дети в полевых командиров элемента (эти дети Warlord элементы) должны иметь уникальное название»
Если вы измените 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>