2008-10-07 10 views
7

Chciałbym utworzyć XML Schema dla tego fragmentu xml, chciałbym ograniczyć wartości „nazwa” atrybutu, tak, że w dokumencie wyjściowym i tylko jeden przykład dnia jest dozwolone dla każdego dnia tygodnia:Jak można zdefiniować wiele elementów w schemacie XML o tej samej nazwie i innej wartości atrybutu?

<a> 
    <day name="monday" /> 
    <day name="tuesday" /> 
    <day name="wednesday" /> 
</a> 

próbowałem użyć to:

<xs:complexType name="a"> 
    <xs:sequence> 
    <xs:element name="day" minOccurs="1" maxOccurs="1"> 
     <xs:complexType> 
     <xs:attribute name="name" use="required"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="monday" /> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="day" minOccurs="1" maxOccurs="1"> 
     <xs:complexType> 
     <xs:attribute name="name" use="required"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="tuesday" /> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

ale XML Schema walidator w Eclipse mówi o błędach „wiele elementów z nazwą«dzień», z różnymi rodzajami, pojawiają się w grupie modelu.”.

Czy istnieje inny sposób?

Odpowiedz

12

trzeba coś takiego:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="day"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="day"> 
    <xs:complexType> 
     <xs:attribute name="name" use="required"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="monday"/> 
       <xs:enumeration value="tuesday"/> 
       <xs:enumeration value="wednesday"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Jose, to się udało, dziękuję za pomoc. –

+2

Nie, to nie wystarczy. Jeśli celem jest dopuszczenie jednego i tylko jednego elementu dla nazwy każdego dnia, ten schemat tego nie zrobi. Musisz użyć xs: unique, aby formalnie określić ograniczenie każdego dnia. – Cheeso

0

Spróbuj tego:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" name="day"> 
       <xs:complexType> 
        <xs:attribute name="atrib" type="xs:string" use="required" /> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

myślę maxOccurs = "nieograniczona" to, co trzeba.

+0

Chciałem ograniczyć również wartości atrybutu, dlatego też wyjaśniłem pytanie. –

0

Czy rozważałeś coś takiego? (Czyli dzień jest typem, a elementy są nazwane po dniach tygodnia)

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="day" /> 
    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="monday" maxOccurs="1" minOccurs="0" type="day" /> 
     <xs:element name="tuesday" maxOccurs="1" minOccurs="0" type="day" /> 
     <xs:element name="wednesday" maxOccurs="1" minOccurs="0" type="day" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Tak, zrobiłem, właściwie używam tego właśnie teraz, ale kwestionowany xml desing wydawał mi się bardziej odpowiedni. Dzięki i tak. –

0

Używaj wyboru zamiast sekwencji

przez to sposób możesz mieć tylko element dnia jeden w elemencie

A dla atrybutu name użyj atrybutu ref i podaj go z wyliczeniem

7

Aby spełnić ograniczenie co najwyżej raz opisane w pytaniu oryginalnym, należy użyć elementu xs:unique w swoim schemacie.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 

    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="day" maxOccurs="7" minOccurs="1"> 
      <xs:complexType> 
      <xs:attribute name="name" use="required"> 
       <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="(mon|tues|wednes|thurs|fri|satur|sun)day"/> 
       </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
      </xs:complexType> 
      <xs:unique name="eachDayAtMostOnce"> 
      <xs:selector xpath="day"/> 
      <xs:field xpath="@name"/> 
      </xs:unique> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema>