2011-10-07 12 views
9

Chcę zadeklarować element, który ma być zawarty w złożonej deklaracji typu, a element ma atrybut obowiązkowy: "option = MyOption", , ale wartość "opcji" atrybut może być wszystkim, zależnie od kontekstu.Element-obowiązkowe deklaracja atrybutu w schemacie XSD:

Oznacza to, że atrybut "opcja" o pewnej nieznanej wartości powinien być obowiązkowy w dowolnym dokumencie przy użyciu typu złożonego zawierającego ten element.

przykład:

<xs:element name="SpecialOption" type="xs:string"/> 

    <xs:complexType name="SpecialOptions"> 
     <xs:sequence> 
      <xs:element ref="SpecialOption" minOccurs="1" maxOccurs="100"/> 
      <xs:element ref="XXX"/>  
     </xs:sequence> 
    </xs:complexType> 

W tym przypadku "SpecialOption" element kompleksu typu "SpecialOptions" powinien to obowiązkowe atrybutu.

Nie wiem, jak zadeklarować obowiązkowy atrybut dla elementu w XSD, lub jak określić, że atrybut musi mieć wartość, która nie jest jeszcze znana.

Odpowiedz

23

Należy zmodyfikować definicję elementu "SpecialOption", aby uwzględnić wymagany atrybut. Aktualizować ten kod:

<xs:element name="SpecialOption" type="xs:string"/> 

do tego:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute name="Option" type="xs:string" use="required"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

z tą zmianą swój typ złożony będzie zawierał wymaganego „Opcja” atrybut wszystkich wystąpień „SpecialOption” elementem „SpecialOptions” kompleksu rodzaj. Deklaracja, że ​​atrybut "Opcja" ma być typu xs:string, pozwoli na przekazanie dowolnej wartości w tym polu.

+0

Brzmi nieźle - właśnie to musiałem wiedzieć: jak uczynić atrybut obowiązkowym elementem elementu. "Deklaracja, że ​​atrybut" Opcja "ma być typu xs: string pozwoli na przekazanie dowolnej wartości w tym polu." Zrozumiałem - ale lepiej mi służy deklarowanie typu wyliczeniowego i rozszerzanie go w miarę ewolucji moich potrzeb. Wypróbuję twój kod - jeśli to działa, masz nagrodę. – Vector

3

Aby oznaczyć atrybut jako obowiązkowy, należy użyć <xs:attribute use="required" />.

Jeśli chodzi o typ, masz do wyboru wbudowane typy XSD (xs: string itp.) Lub możesz zdefiniować własne <xs:simpleType /> i użyć tego.

UPDATE

nie jestem pewien co masz na myśli przez atrybut musi mieć wartość, która nie jest jeszcze znana. Czy to oznacza, że ​​wartość jest łańcuchem, ale może być dowolnym ciągiem znaków? Lub dziesiętny?

Ponieważ jest to wartość atrybutu, o której mówimy, ograniczamy się do korzystania z wbudowanych typów XSD lub definiowania własnego typu xs:simpleType na podstawie jednego z wbudowanych typów. W tym miejscu można zastosować bardziej rygorystyczne reguły do ​​dozwolonej wartości, na przykład przez rozszerzenie xs:string i dodanie ograniczenia wyrażenia regularnego do dozwolonych wartości.

<xsd:simpleType name="UKDate"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:pattern value="(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\d\d"/> 
    </xsd:restriction> 
</xsd:simpleType> 

Jednakże, jeśli nie ma absolutnie żadnej możliwości dowiedzenia się, jakie wartości będą wykorzystywane potem trzeba znanego paradoksu czasowego przy czym nie można ograniczyć coś w czasie projektowania do wartości znasz tylko w czasie wykonywania. W tym przypadku na pewno konieczne jest tylko określenie, że atrybut musi przynajmniej być obecny?

<xs:attribute use="required" />

Nadzieja to odpowiedzi na swoje pytania trochę jaśniej.

+0

Niezbyt wyraźnie - nie wyjaśniłeś, jak zadeklarować element, który zawiera obowiązkowy atrybut. – Vector

15

1) Jest to atrybut prosty Wymagany ciąg

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" type="xs:string" use="required"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

2) żądania dokładnie jedną z listy dozwolonych wartości:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:enumeration value="DE"/> 
          <xs:enumeration value="EN"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

3) Można wykorzystać szereg jako ograniczenie , jak w poniższym przykładzie.

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:restriction base="xs:integer"> 
          <xs:minInclusive value="95"/> 
          <xs:maxInclusive value="137"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

4) Poniżej atrybut jest zadeklarowany jako lista zawierająca wartości dziesiętne. Dzięki temu atrybut może zawierać podzbiór określonych wartości, np. Opcja = "6 77 95".

<xs:simpleType name="Items"> 
    <xs:restriction base="xs:decimal"> 
     <xs:enumeration value="137"/> 
     <xs:enumeration value="95"/> 
     <xs:enumeration value="6"/> 
     <xs:enumeration value="77"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:list itemType="Items"/> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

5) Tu atrybut jest zadeklarowana opcjonalne, ale pod warunkiem, ze wartość domyślną („test”), który jest czasami wystarczy:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" type="xs:string" use="optional" default="test"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 
+0

+1 - Twoja odpowiedź jest szczegółowa i bardzo pouczająca, ale dałem nagrodę za odpowiedź 2, ponieważ była wystarczająca i była o wiele wcześniejsza niż Twoja. Tnx – Vector

+0

Dziękuję, ale i tak nadszedł czas, wziąłem pod uwagę twoje komentarze. Rozumiem jednak, że odpowiedź 2 była wystarczająca, więc nie ma problemu:] – mousio

0

prostu można zrobić go jako następnego

<xs:element name="SpecialOption"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:whiteSpace value="replace"/> 
      <xs:minLength value="1"></xs:minLength> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 

tym kodem wymusza się wstawienie wartości do znacznika xml, a także ograniczenie białych znaków spowoduje usunięcie spacji z tagu xml.

Powiązane problemy