私の問題(または質問)は、xs:integerとして入力された空の要素を中心にしています。空の要素を許可する必要があるため、以下のスキーマに示すように、ユニオンを使用して空の要素または有効な整数を値として許可しました。ただし、私のスキーマは2つの役割を果たしており、String、Float、Integer、またはDateのデータ型を想定するサードパーティソフトウェアにインポートする必要もあります。すべての整数に対して和集合法を使用してスキーマをコーディングすると、ソフトウェアでは整数として入力されません。整数データ型に空の要素を許可するunionメソッド以外の方法はありますか? XSDを1つだけにしたいのですが、それが必要な場合は2つ持つことができます。
与えられた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>
やってみました
<xs:element name="roles" type="xs:integer" nillable="true"/>
あなたがしなければならないことは、同じ要素に2つの制限を割り当て、さらに次の例のようにそれらを結合することです。
<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検証に任意の整数値を許可し、要素が空の場合は許可するように指示します。
こんにちは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