Мощность элемента XSD — как смоделировать ‘Одно из полей является обязательным’

#xml #xsd

#xml #xsd

Вопрос:

В моем элементе XSD я должен сделать «одно из полей FieldA или FileDB обязательным».

 So far i have this:


<xsd:complexType name="Test">
            <xsd:sequence>
                <xsd:element name="fieldA" maxOccurs="1"    minOccurs="0"/>
                <xsd:element name="fieldB" maxOccurs="1" minOccurs="0"/>
            </xsd:sequence>
</xsd:complexType>
  

Как установить мощность для этих 2 полей, чтобы одно было обязательным?

Большое вам спасибо за ваше время и усилия!

Комментарии:

1. Девять вопросов, и только три отмечены как ответы. Хотите больше ответов? Начните отмечать лучший ответ как правильный.

Ответ №1:

Используйте <xsd:choice> вместо <xsd:sequence> и отбросьте minOccurs="0"

Пример кода, который требует ровно одно из полей

 <xsd:complexType name="Test">
    <xsd:choice>
        <xsd:element name="fieldA"/>
        <xsd:element name="fieldB"/>
    </xsd:choice>
</xsd:complexType>
  

Если вы хотите потребовать, чтобы было <fieldA> или <fieldB> или оба элемента в любом порядке, тогда используйте это

 <xsd:complexType name="Test">
    <xsd:choice>
        <xsd:sequence>
            <xsd:element name="fieldA"/>
            <xsd:element name="fieldB" minOccurs="0"/>
        </xsd:sequence>
        <xsd:sequence>
            <xsd:element name="fieldB"/>
            <xsd:element name="fieldA" minOccurs="0"/>
        </xsd:sequence>
    </xsd:choice>
</xsd:complexType>
  

Если вы хотите потребовать, чтобы было <fieldA> или <fieldB> или оба элемента и сохранить порядок ( <fieldA> до <fieldB> ), тогда вы можете немного упростить структуру.

 <xsd:complexType name="Test">
    <xsd:choice>
        <xsd:sequence>
            <xsd:element name="fieldA"/>
            <xsd:element name="fieldB" minOccurs="0"/>
        </xsd:sequence>
        <xsd:element name="fieldB"/>
    </xsd:choice>
</xsd:complexType>
  

Комментарии:

1. Большое вам спасибо за этот полезный ответ. Тем не менее, у меня есть одна проблема.

2. Мне нужно, чтобы оба поля вводили строку и ограничивали длину до 10. Когда я копировал ваш код, в моем визуальном редакторе Eclipse тип был «anytype». Я пытаюсь изменить тип с anyType на string и получаю сообщение об ошибке: «XSD: элемент ‘#FieldA’ может не иметь обоих типов ‘ w3.org/2001/XMLSchema#anyType » и напечатать » w3.org/2001/XMLSchema#string » »

3. @reg Тип вызван anyType тем <xsd:element> , что в определении нет <xsd:simpleType> <xsd:complexType> дочернего элемента или, который определяет тип этого элемента, или type атрибута, который ссылается на глобально определенный тип. В вашем случае вам нужно создать simpleType с maxLength="10" ограничением. Примеры можно найти в различных руководствах по схемам, например, в этих двух roseindia.net/tutorial/xml/user-derived-simple-types.html и learn-xml-schema-tutorial.com/Simple-Type-Elements.cfm

Ответ №2:

Элемент выбора может вам помочь:

 <xs:complexType name="Test">
    <xs:choice>
         <xs:element name="fieldA" maxOccurs="1" minOccurs="0"/>
         <xs:element name="fieldB" maxOccurs="1" minOccurs="0"/>
    </xs:choice>
</xs:complexType>
  

Подробнее: http://www.w3schools.com/Schema/el_choice.asp