XSD: параметры для разрешения нулевых значений при объявлении типов данных xs: integer - PullRequest
10 голосов
/ 30 ноября 2010

Моя проблема (или вопрос) сосредоточена вокруг пустых элементов, которые напечатаны как xs: integer.Мне нужно разрешить пустые элементы, поэтому я использовал объединение, чтобы разрешить пустой элемент или допустимое целое число в качестве значения, как показано на схеме ниже.Однако моя схема выполняет двойную роль, и ее также необходимо импортировать в стороннее программное обеспечение, которое ожидает типы данных String, Float, Integer или Date.Если я кодирую схему, используя метод объединения для всех целых чисел, они не будут напечатаны как целые числа в программном обеспечении.Есть ли другой способ, кроме метода объединения, позволяющий пустой элемент для целочисленных типов данных?Я хотел бы просто иметь один XSD, но может иметь два, если это то, что должно произойти.

Данный пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<company>
    <division>
        <department>
            <roles/>
            <employees>7</employees>
        </department>
    </division>
</company>

И схема:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:simpleType name="nullval">
        <xs:union memberTypes="IntegerType empty"/>
    </xs:simpleType>
    <xs:simpleType name="IntegerType">
        <xs:restriction base="xs:integer"/>
    </xs:simpleType>
    <xs:simpleType name="empty">
        <xs:restriction base="xs:string">
            <xs:maxLength value="0"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="company">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="division">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="department" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType>
                                    <!-- elements may appear in any order -->
                                    <xs:all minOccurs="0" maxOccurs="1">
                                        <xs:element name="roles" type="nullval"/>
                                        <xs:element name="employees" type="xs:integer"/>
                                    </xs:all>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Ответы [ 4 ]

13 голосов
/ 30 ноября 2010

Вы пробовали

<xs:element name="roles" type="xs:integer" nillable="true"/>
8 голосов
/ 12 ноября 2013

Что вам нужно сделать, это назначить два ограничения на один и тот же элемент, а также объединить их, как в следующем примере:

<xs:element name='job_code'>
  <xs:simpleType>
    <xs:union>
      <xs:simpleType>
        <xs:restriction base='xs:string'>
          <xs:length value='0'/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base='xs:integer'>
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
</xs:element>

Используя это ограничение, вы указываете валидации XML разрешить любое целочисленное значение и разрешить элемент, если он пуст.

5 голосов
/ 22 марта 2013

hi the nillable = "true" и minOccurs = "0" работают только тогда, когда вы вообще не отправляете тег.Однако, если вам нужно передать пустое значение внутри тегов, я думаю, что вы должны реализовать объединение.

3 голосов
/ 19 июня 2013

У меня было такое же требование сегодня. Следующий XSD допускает только пустое значение или любое значение от -1 до 999

Я извлекаю только необходимые данные из очень большого XSD, поэтому некоторые из них могут выглядеть излишними.

<xs:simpleType name="emptyString">
    <xs:restriction base="xs:string">
    <xs:enumeration value=""/>
    </xs:restriction>
</xs:simpleType>


<xs:simpleType name="int-1999">
 <xs:restriction base="xs:int">
 <xs:minInclusive value="-1"/>
 <xs:maxInclusive value="999"/>
 </xs:restriction>
</xs:simpleType>


<xs:element name="preNotificationPeriod" nillable="true">
  <xs:simpleType>
  <xs:union memberTypes="int-1999 emptyString"/>
  </xs:simpleType>
</xs:element>

Ссылка - http://www.ilearnttoday.com/xsd-empty-values-and-range-restriction-for-numeric-types

Подробнее об этой статье

...