#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>