XSD: параметры разрешения значений null при объявлении типов данных xs:integer

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


ты пробовал

<xs:element name="roles" type="xs:integer" nillable="true"/>

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

<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 разрешить любое целочисленное значение и разрешить элемент, если он пуст.


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


У меня было такое же требование сегодня. После 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

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