Какой тип данных может принимать пустое или иметь одно значение в XSD?

#xml #xsd #xsd-validation

#xml #xsd #xsd-проверка

Вопрос:

В файле XSD у меня есть элемент с двузначным номером price="90" , но я хочу, чтобы он также принимал empty. Какой тип данных должен быть указан в XSD ?!

Ответ №1:

вы можете сделать элемент nillable .

 <xs:element name="Price"
            nillable="true">
    <xs:simpleType>
        <xs:restriction base="xs:int">
            <xs:totalDigits value="2"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>
 

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

1. Но если вы это сделаете, он будет принимать пустое значение только в том случае, если в элементе указано xsi:nil="true" , что довольно неуклюже.

Ответ №2:

Мой предпочтительный подход заключается в определении элемента как имеющего тип списка:

   <xs:simpleType name="twoDigitNumber">
    <xs:restriction base="xs:int">
      <xs:totalDigits value="2"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="listOfTwoDigitNumbers">
    <xs:list itemType="twoDigitNumber"/>
  </xs:simpleType>
  
  <xs:simpleType name="optionalTwoDigitNumber">
    <xs:restriction base="listOfTwoDigitNumbers">
      <xs:maxLength value="1"/>
    </xs:restriction>
  </xs:simpleType>
 

Другой популярный подход заключается в определении типа объединения с типами членов, представляющими собой (а) двузначное целое число и (б) строку с maxLength=0. Два подхода дают одинаковый эффект с точки зрения проверки, но будут работать по-разному, если вы используете технологии привязки данных или выражения XPath с поддержкой схемы.

Я не большой поклонник nillable/ xsi:nil . Просить людей помечать пустые экземпляры с xsi:nil помощью, когда совершенно очевидно, что элемент пуст, похоже, не служит никакой полезной цели; и это не работает для атрибутов.

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

1. Согласен, что этот xsi:nil вариант не самый лучший, и ваш выглядит более чистым на выходе, но также сложным в схеме. К сожалению, некоторые генераторы кода (например, xsd2code) не могут работать с такими схемами. Он создал строковое свойство на основе схемы. Но я буду иметь это в виду. Первый коллега, который жалуется на xsi:nil , получит ваше решение.